@kusinta/iot-schema 0.2.0-beta.6 → 0.2.0-beta.60

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.
Files changed (73) hide show
  1. package/package.json +44 -29
  2. package/src/kusinta/iot/access/v1/acl_pb.d.ts +146 -2
  3. package/src/kusinta/iot/access/v1/acl_pb.js +19 -2
  4. package/src/kusinta/iot/access/v1/roles_pb.d.ts +160 -4
  5. package/src/kusinta/iot/access/v1/roles_pb.js +128 -5
  6. package/src/kusinta/iot/accountlink/v1/account_link_pb.d.ts +591 -0
  7. package/src/kusinta/iot/accountlink/v1/account_link_pb.js +160 -0
  8. package/src/kusinta/iot/climate/v1/climate_pb.d.ts +1695 -0
  9. package/src/kusinta/iot/climate/v1/climate_pb.js +292 -0
  10. package/src/kusinta/iot/commissioning/v1/commissioning_pb.d.ts +1642 -0
  11. package/src/kusinta/iot/commissioning/v1/commissioning_pb.js +339 -0
  12. package/src/kusinta/iot/common/v1/pairing_pb.d.ts +24 -4
  13. package/src/kusinta/iot/common/v1/pairing_pb.js +1 -1
  14. package/src/kusinta/iot/common/v1/types_pb.d.ts +235 -0
  15. package/src/kusinta/iot/common/v1/types_pb.js +84 -2
  16. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +713 -3
  17. package/src/kusinta/iot/connector/v1/connector_pb.js +107 -16
  18. package/src/kusinta/iot/device/v1/cluster_state_pb.d.ts +213 -1
  19. package/src/kusinta/iot/device/v1/cluster_state_pb.js +37 -2
  20. package/src/kusinta/iot/device/v1/descriptor_pb.d.ts +32 -4
  21. package/src/kusinta/iot/device/v1/descriptor_pb.js +2 -1
  22. package/src/kusinta/iot/device/v1/device_event_pb.d.ts +89 -5
  23. package/src/kusinta/iot/device/v1/device_event_pb.js +1 -1
  24. package/src/kusinta/iot/device/v1/device_pb.d.ts +444 -11
  25. package/src/kusinta/iot/device/v1/device_pb.js +74 -2
  26. package/src/kusinta/iot/device/v1/properties_pb.d.ts +26 -5
  27. package/src/kusinta/iot/device/v1/properties_pb.js +1 -1
  28. package/src/kusinta/iot/device/v1/property_update_pb.d.ts +46 -2
  29. package/src/kusinta/iot/device/v1/property_update_pb.js +2 -1
  30. package/src/kusinta/iot/heating/v1/heating_pb.d.ts +659 -0
  31. package/src/kusinta/iot/heating/v1/heating_pb.js +119 -0
  32. package/src/kusinta/iot/link/v1/link_pb.d.ts +438 -0
  33. package/src/kusinta/iot/link/v1/link_pb.js +121 -0
  34. package/src/kusinta/iot/planning/v1/planning_pb.d.ts +199 -0
  35. package/src/kusinta/iot/planning/v1/planning_pb.js +48 -0
  36. package/src/kusinta/iot/planning/v1/planning_service_pb.d.ts +121 -0
  37. package/src/kusinta/iot/planning/v1/planning_service_pb.js +38 -0
  38. package/src/kusinta/iot/registration/v1/registration_pb.d.ts +18 -0
  39. package/src/kusinta/iot/registration/v1/registration_pb.js +1 -1
  40. package/src/kusinta/iot/reporting/v1/reporting_pb.d.ts +1263 -0
  41. package/src/kusinta/iot/reporting/v1/reporting_pb.js +238 -0
  42. package/src/kusinta/iot/reporting/v1/reporting_service_pb.d.ts +63 -0
  43. package/src/kusinta/iot/reporting/v1/reporting_service_pb.js +24 -0
  44. package/src/kusinta/iot/signaling/v1/signaling_pb.d.ts +939 -7
  45. package/src/kusinta/iot/signaling/v1/signaling_pb.js +163 -4
  46. package/src/kusinta/iot/signaling/v1/signaling_service_pb.d.ts +24 -1
  47. package/src/kusinta/iot/signaling/v1/signaling_service_pb.js +1 -1
  48. package/src/kusinta/iot/space/v1/space_pb.d.ts +218 -3
  49. package/src/kusinta/iot/space/v1/space_pb.js +25 -2
  50. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +15 -0
  51. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +1 -1
  52. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.d.ts +69 -0
  53. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js +19 -0
  54. package/src/kusinta/iot/vendor/v1/vendor_options_pb.d.ts +5 -4
  55. package/src/kusinta/iot/vendor/v1/vendor_options_pb.js +5 -4
  56. package/src/kusinta/iot/webrtc/v1/app_token_pb.d.ts +48 -5
  57. package/src/kusinta/iot/webrtc/v1/app_token_pb.js +1 -1
  58. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +56 -0
  59. package/src/kusinta/iot/webrtc/v1/command_pb.js +1 -1
  60. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +179 -5
  61. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +34 -5
  62. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +603 -13
  63. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +61 -4
  64. package/src/kusinta/iot/webrtc/v1/household_pb.d.ts +613 -0
  65. package/src/kusinta/iot/webrtc/v1/household_pb.js +134 -0
  66. package/src/kusinta/iot/webrtc/v1/invite_pb.d.ts +502 -0
  67. package/src/kusinta/iot/webrtc/v1/invite_pb.js +108 -0
  68. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +2595 -75
  69. package/src/kusinta/iot/webrtc/v1/management_pb.js +382 -5
  70. package/src/kusinta/iot/webrtc/v1/members_pb.d.ts +582 -0
  71. package/src/kusinta/iot/webrtc/v1/members_pb.js +113 -0
  72. package/src/kusinta/iot/webrtc/v1/permission_push_pb.d.ts +66 -4
  73. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +9 -1
@@ -60,12 +60,21 @@ export declare type DeviceEvent = Message<"kusinta.iot.device.v1.DeviceEvent"> &
60
60
  eventId: number;
61
61
 
62
62
  /**
63
- * Matter's EventNumber: monotonically increasing per node, and the reason an event log
64
- * can be resumed rather than merely replayed. A consumer that sees a gap knows it missed
65
- * something and can say so — the one guarantee a PropertyUpdate stream cannot give.
63
+ * The device's event number, as its connector numbers it — per device, where Matter's
64
+ * EventNumber is per node; a connector renumbers what a node gives it. It is the reason
65
+ * an event log can be resumed rather than merely replayed. A consumer that sees a gap
66
+ * knows it missed something and can say so — the one guarantee a PropertyUpdate stream
67
+ * cannot give. On the app leg a gap is judged by previous_event_number and follows_loss
68
+ * below, not by a skip in this number.
66
69
  *
67
- * Monotonic within one device. Do NOT compare across devices; they are unrelated
68
- * sequences.
70
+ * Monotonic within one device, its connector and one numbering_id — a device that moves
71
+ * to another connector begins a new sequence — and consecutive as a connector delivers
72
+ * it: a connector numbers each device's events on its own, so a skip means events were
73
+ * lost — including ones the connector lost itself, whose numbers it skips. A number at or
74
+ * below one already received for the device from the same connector under the same
75
+ * numbering_id is that event again — a connector resends what it could not confirm,
76
+ * always the whole unconfirmed tail of what it sent, in order — and is dropped. Do NOT
77
+ * compare across devices; they are unrelated sequences.
69
78
  *
70
79
  * @generated from field: uint64 event_number = 5;
71
80
  */
@@ -92,6 +101,81 @@ export declare type DeviceEvent = Message<"kusinta.iot.device.v1.DeviceEvent"> &
92
101
  * @generated from field: kusinta.iot.device.v1.AttributeValue data = 8;
93
102
  */
94
103
  data?: AttributeValue | undefined;
104
+
105
+ /**
106
+ * How a recipient tells events it was not sent from events that were lost. Filled by the
107
+ * gateway on the app leg; a connector leaves both unset.
108
+ *
109
+ * A recipient is not sent every event of a device: which ones it receives depends on its
110
+ * grant (access.v1.DeviceAcl.allowed_event_refs), so event_number skips wherever an event
111
+ * went to somebody else. A skip in event_number is therefore NOT a gap. A gap is:
112
+ *
113
+ * * previous_event_number set, the recipient holding a last-received event_number for
114
+ * this device under the same numbering_id (whether or not it kept the event), and
115
+ * previous_event_number above it — its log misses events the gateway sent this user,
116
+ * on another session or while it was away, or that were lost; one at or below it is
117
+ * no gap; or
118
+ * * follows_loss set on an event above the last number the recipient holds, or when it
119
+ * holds none.
120
+ *
121
+ * Otherwise — previous_event_number unset, or the recipient holding no number for the
122
+ * device under that numbering_id — continuity is unknown, and only follows_loss claims a
123
+ * gap: the gateway knows events were lost, whatever the recipient holds.
124
+ *
125
+ * event_number counts a device's events over its life, so it tells anyone it reaches
126
+ * roughly how many events came before; that much the number discloses. And it is still
127
+ * the device's own, so a recipient granted only some of a device's events learns from it
128
+ * how many it was not sent: that much a partial grant of events discloses.
129
+ *
130
+ * previous_event_number never names an event from before the user's current residency in
131
+ * a home, nor from before their current, unbroken stretch of seeing the device, nor from
132
+ * before the home's climate history was last cleared (webrtc.v1 household.proto, CLIMATE
133
+ * HISTORY), which erases its events — it is unset instead, and follows_loss then looks no
134
+ * further back either. Otherwise it is the
135
+ * event_number of the previous event of this device that this user was due — within the
136
+ * grant they held when it happened — whether or not any session of theirs was open to be
137
+ * sent it, so that events missed while away are a gap like any other. A number of the
138
+ * event's own numbering_id. Unset when the gateway has received no such event under that
139
+ * numbering since the gateway itself last started — the first event after a numbering
140
+ * restart included: continuity is then unknown. The gateway remembers nothing of a
141
+ * numbering across its own restart, so follows_loss too covers only what it received
142
+ * since, and a resend it can no longer recognise reaches the app: an app drops an event
143
+ * whose number is at or below the last it holds for the device under the same
144
+ * numbering_id.
145
+ *
146
+ * @generated from field: optional uint64 previous_event_number = 9;
147
+ */
148
+ previousEventNumber?: bigint | undefined;
149
+
150
+ /**
151
+ * Set when the gateway itself missed events of this device since previous_event_number —
152
+ * or, when that is unset, since the latest of the start of what the user may learn of the
153
+ * device, the start of the current numbering and the gateway's own last start — the
154
+ * sequence it receives from the device skipped. A restart of the numbering is not itself
155
+ * a loss; a connector shows what it lost by skipping numbers. What was lost is unknown,
156
+ * so it may have been an event this recipient would have been sent.
157
+ *
158
+ * @generated from field: bool follows_loss = 10;
159
+ */
160
+ followsLoss: boolean;
161
+
162
+ /**
163
+ * Which numbering event_number belongs to. A connector changes it whenever it restarts a
164
+ * device's numbering — after losing its own count — so that a restart is never mistaken
165
+ * for a resend. The gateway then begins a new sequence for the device: the first event of
166
+ * it that each user is due carries previous_event_number unset, continuity unknown. A new
167
+ * value is one never used before for the device — a UUIDv4 is the expected form. Opaque;
168
+ * compare for equality only. Empty is a numbering like any other, for a connector whose
169
+ * count for a device never restarts; a connector that begins a device's sequence anew —
170
+ * having lost its count, or the device having come back to it — must give it a
171
+ * numbering_id never used for that device before. Every numbering starts at 1. On the app leg
172
+ * the gateway derives it from the connector's own id and the connector's numbering_id
173
+ * alone, so that it is the same across a gateway restart and changes whenever either
174
+ * does — a numbering restart, or a device moving to another connector.
175
+ *
176
+ * @generated from field: string numbering_id = 11;
177
+ */
178
+ numberingId: string;
95
179
  };
96
180
 
97
181
  /**
@@ -11,7 +11,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
11
11
  * Describes the file kusinta/iot/device/v1/device_event.proto.
12
12
  */
13
13
  export const file_kusinta_iot_device_v1_device_event = /*@__PURE__*/
14
- fileDesc("CihrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlX2V2ZW50LnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEixQIKC0RldmljZUV2ZW50EjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEhgKC2VuZHBvaW50X2lkGAIgASgNSACIAQESEgoKY2x1c3Rlcl9pZBgDIAEoDRIQCghldmVudF9pZBgEIAEoDRIUCgxldmVudF9udW1iZXIYBSABKAQSLQoJdGltZXN0YW1wGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI2Cghwcmlvcml0eRgHIAEoDjIkLmt1c2ludGEuaW90LmRldmljZS52MS5FdmVudFByaW9yaXR5EjMKBGRhdGEYCCABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVCDgoMX2VuZHBvaW50X2lkIncKEERldmljZUV2ZW50QmF0Y2gSMgoGZXZlbnRzGAEgAygLMiIua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUV2ZW50Ei8KC3JlY2VpdmVkX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCp/Cg1FdmVudFByaW9yaXR5Eh4KGkVWRU5UX1BSSU9SSVRZX1VOU1BFQ0lGSUVEEAASGAoURVZFTlRfUFJJT1JJVFlfREVCVUcQARIXChNFVkVOVF9QUklPUklUWV9JTkZPEAISGwoXRVZFTlRfUFJJT1JJVFlfQ1JJVElDQUwQA0ICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_identity_v1_identity]);
14
+ fileDesc("CihrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlX2V2ZW50LnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEirwMKC0RldmljZUV2ZW50EjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEhgKC2VuZHBvaW50X2lkGAIgASgNSACIAQESEgoKY2x1c3Rlcl9pZBgDIAEoDRIQCghldmVudF9pZBgEIAEoDRIUCgxldmVudF9udW1iZXIYBSABKAQSLQoJdGltZXN0YW1wGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI2Cghwcmlvcml0eRgHIAEoDjIkLmt1c2ludGEuaW90LmRldmljZS52MS5FdmVudFByaW9yaXR5EjMKBGRhdGEYCCABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUSIgoVcHJldmlvdXNfZXZlbnRfbnVtYmVyGAkgASgESAGIAQESFAoMZm9sbG93c19sb3NzGAogASgIEhQKDG51bWJlcmluZ19pZBgLIAEoCUIOCgxfZW5kcG9pbnRfaWRCGAoWX3ByZXZpb3VzX2V2ZW50X251bWJlciJ3ChBEZXZpY2VFdmVudEJhdGNoEjIKBmV2ZW50cxgBIAMoCzIiLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VFdmVudBIvCgtyZWNlaXZlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqfwoNRXZlbnRQcmlvcml0eRIeChpFVkVOVF9QUklPUklUWV9VTlNQRUNJRklFRBAAEhgKFEVWRU5UX1BSSU9SSVRZX0RFQlVHEAESFwoTRVZFTlRfUFJJT1JJVFlfSU5GTxACEhsKF0VWRU5UX1BSSU9SSVRZX0NSSVRJQ0FMEANCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_identity_v1_identity]);
15
15
 
16
16
  /**
17
17
  * Describes the message kusinta.iot.device.v1.DeviceEvent.
@@ -2,11 +2,11 @@
2
2
  // @generated from file kusinta/iot/device/v1/device.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
  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
 
@@ -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.
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
@@ -181,6 +182,29 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
181
182
  case: "hmMaintenance";
182
183
  } | { case: undefined; value?: undefined };
183
184
 
185
+ /**
186
+ * How well this device's radio link is doing, on whichever endpoint its connector
187
+ * reports it. Outside vendor_properties on purpose: it is not a vendor's extension of
188
+ * one device type but a reading any radio device has, so it must be able to sit beside
189
+ * whichever vendor case the endpoint already carries — on a HomeMatic device's Power
190
+ * Source endpoint, beside hm_maintenance. Selected by the vendor branch like a
191
+ * vendor_properties case, by its (vendor_extension) key "kusinta.radio".
192
+ *
193
+ * @generated from field: kusinta.iot.device.v1.RadioLink radio_link = 52;
194
+ */
195
+ radioLink?: RadioLink | undefined;
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
+
184
208
  /**
185
209
  * Every cluster this endpoint hosts: what it supports, and any attribute value that has
186
210
  * no typed field above. This is what makes a device the schema does not model usable
@@ -195,14 +219,18 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
195
219
  clusters: ClusterState[];
196
220
 
197
221
  /**
198
- * Which vendor parameters this endpoint's vendor extension actually implements, in the
222
+ * Which vendor parameters this endpoint's vendor extensions actually implement, in the
199
223
  * vendor's own spelling — "SABOTAGE", matching (vendor_attribute) byte for byte.
200
224
  *
201
225
  * The vendor mirror of ClusterState.attribute_ids, and it needs its own field because a
202
226
  * vendor parameter has no cluster and so no ClusterState to be listed in. A name list
203
- * rather than an id list because the vendor branch addresses by name, and a bare list
204
- * rather than a per-extension map because an endpoint carries at most one vendor
205
- * extension.
227
+ * rather than an id list because the vendor branch addresses by name. A bare list
228
+ * rather than a per-extension map because an endpoint carries at most one
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.
206
234
  *
207
235
  * Same reading as the Matter side: named here with no value = implemented, not yet
208
236
  * reported. Absent from the list = this device does not have it. Empty = not stated,
@@ -215,6 +243,18 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
215
243
  * @generated from field: repeated string vendor_attribute_names = 17;
216
244
  */
217
245
  vendorAttributeNames: string[];
246
+
247
+ /**
248
+ * What a write to each vendor parameter leaves behind, and how late its reports arrive,
249
+ * keyed by the parameter's vendor name as vendor_attribute_names spells it. The vendor
250
+ * mirror of ClusterState.attribute_behaviours, with the same rules: an absent key is
251
+ * "not stated", and not stated is read as the worst case. For a parameter reached through
252
+ * a vendor's service, the name is the vendor's stable parameter id where it has one,
253
+ * never a display name that is translated or renamed between firmware versions.
254
+ *
255
+ * @generated from field: map<string, kusinta.iot.device.v1.AttributeBehaviour> vendor_attribute_behaviours = 18;
256
+ */
257
+ vendorAttributeBehaviours: { [key: string]: AttributeBehaviour };
218
258
  };
219
259
 
220
260
  /**
@@ -246,15 +286,43 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
246
286
  descriptor?: DeviceDescriptor | undefined;
247
287
 
248
288
  /**
249
- * 15-19 are free; 20+ is the timestamp band.
289
+ * 17-19 are free; 20+ is the timestamp band.
250
290
  *
251
291
  * @generated from field: repeated kusinta.iot.device.v1.Endpoint endpoints = 14;
252
292
  */
253
293
  endpoints: Endpoint[];
254
294
 
255
295
  /**
256
- * When the gateway last had evidence this device exists and is reachable — the
257
- * most recent PropertyUpdate, announcement, or command result concerning it.
296
+ * The fewest seconds this device needs between two writes, to any of its attributes on
297
+ * any endpoint, without dropping one: a radio limited to a share of airtime, a battery
298
+ * device that wakes on a schedule. A device-wide budget rather than a per-attribute one,
299
+ * because two attributes each written at their own pace still share one radio. Stated by
300
+ * the producer at announcement. Absent: not stated, never zero.
301
+ *
302
+ * A lower bound, not the whole budget: devices behind one radio gateway or one hub share
303
+ * its airtime, and a vendor's service limits an account rather than a device, so a writer
304
+ * may have to space writes further apart than this says.
305
+ *
306
+ * @generated from field: optional uint32 min_write_interval_seconds = 15;
307
+ */
308
+ minWriteIntervalSeconds?: number | undefined;
309
+
310
+ /**
311
+ * The longest a write can take to reach the device: a device that listens only after
312
+ * its own report takes a write at its next one. Stated by the producer at announcement.
313
+ * Absent: not stated, never zero. A writer that renews a lease renews it this long, plus
314
+ * a margin, before the lease runs out, or the output lapses between renewals.
315
+ *
316
+ * @generated from field: optional uint32 max_write_delay_seconds = 16;
317
+ */
318
+ maxWriteDelaySeconds?: number | undefined;
319
+
320
+ /**
321
+ * When the gateway last had evidence this device itself — the
322
+ * most recent PropertyUpdate (wheter or not the property changed) or command
323
+ * result concerning it. Should not be advanced on a device announcement: a
324
+ * connector typically re-announces from its own device list, so a device with a
325
+ * flat battery would otherwise keep looking freshly seen.
258
326
  * Gateway-observed, not connector-reported: no message on either leg carries a
259
327
  * per-device liveness timestamp, so this is as precise as the device's own report
260
328
  * interval. A device that reports every 15 minutes looks stale for 15 minutes.
@@ -265,12 +333,20 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
265
333
  * Advisory, for showing staleness in a UI. It is not a removal signal — that is
266
334
  * webrtc.v1.DeviceRemoved, sent only when a connector reports the device gone.
267
335
  *
336
+ * Unset in a service view (access.v1.DeviceAcl.relation SERVICE): a device that reports on
337
+ * change would give away each opening and each turn of a knob. Service learns whether it
338
+ * is reachable from webrtc.v1.ServiceStatus.
339
+ *
268
340
  * @generated from field: google.protobuf.Timestamp last_seen = 20;
269
341
  */
270
342
  lastSeen?: Timestamp | undefined;
271
343
 
272
344
  /**
273
- * When any field of this Device last changed value.
345
+ * When any field of this Device last changed value. Unset in a service view, for the
346
+ * reason last_seen is. Both are also unset when they date from before the recipient's
347
+ * current residency in the home, or from a home they did not live in at the time (see
348
+ * access.v1.MembershipRelation).
349
+ * Whether such a device is reachable is still told by its webrtc.v1.ServiceStatus.
274
350
  *
275
351
  * @generated from field: google.protobuf.Timestamp last_updated = 21;
276
352
  */
@@ -283,3 +359,360 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
283
359
  */
284
360
  export declare const DeviceSchema: GenMessage<Device>;
285
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
+ * The power its internal electric add-on heat (an immersion heater or an electric boiler
500
+ * inside the heat source) draws now, in watts: 0 while it is off or blocked. Absent for a
501
+ * heat source without one, or whose connector cannot read it.
502
+ *
503
+ * @generated from field: optional uint32 add_on_heat_watts = 12;
504
+ */
505
+ addOnHeatWatts?: number | undefined;
506
+ };
507
+
508
+ /**
509
+ * Describes the message kusinta.iot.device.v1.HeatSourceReadings.
510
+ * Use `create(HeatSourceReadingsSchema)` to create a new message.
511
+ */
512
+ export declare const HeatSourceReadingsSchema: GenMessage<HeatSourceReadings>;
513
+
514
+ /**
515
+ * A device's radio link, as its connector reports it.
516
+ *
517
+ * Travels as vendor-branch PropertyUpdates with vendor_extension "kusinta.radio" and
518
+ * these attribute names, the value case following the field type as everywhere on the
519
+ * vendor branch: "quality" as uint_value, "rssi_dbm" as int_value, "snr_db" as
520
+ * float_value.
521
+ *
522
+ * Every field is `optional`, for the reason vendor readings always are: absent means
523
+ * never reported, present means a reading.
524
+ *
525
+ * Technology-agnostic: the same message for every radio. A vendor's own raw radio
526
+ * readings, such as HmMaintenanceProps.rssi_device, stay in that vendor's extension.
527
+ *
528
+ * @generated from message kusinta.iot.device.v1.RadioLink
529
+ */
530
+ export declare type RadioLink = Message<"kusinta.iot.device.v1.RadioLink"> & {
531
+ /**
532
+ * The connector's rating: GOOD = 1, FAIR = 2, POOR = 3 (RadioQuality); 0 is not used.
533
+ * A number, not the name, as every enum-valued reading travels.
534
+ *
535
+ * @generated from field: optional uint32 quality = 1;
536
+ */
537
+ quality?: number | undefined;
538
+
539
+ /**
540
+ * Received signal strength in dBm. sint32: negative in normal operation.
541
+ *
542
+ * @generated from field: optional sint32 rssi_dbm = 2;
543
+ */
544
+ rssiDbm?: number | undefined;
545
+
546
+ /**
547
+ * Signal-to-noise ratio in dB, for technologies that measure one — LoRaWAN does.
548
+ * Absent elsewhere. Negative values are normal for LoRa.
549
+ *
550
+ * @generated from field: optional float snr_db = 3;
551
+ */
552
+ snrDb?: number | undefined;
553
+ };
554
+
555
+ /**
556
+ * Describes the message kusinta.iot.device.v1.RadioLink.
557
+ * Use `create(RadioLinkSchema)` to create a new message.
558
+ */
559
+ export declare const RadioLinkSchema: GenMessage<RadioLink>;
560
+
561
+ /**
562
+ * The value set of HeatSourceReadings.producing: what a heat source is producing now. Not a
563
+ * field type — producing is a uint32 like every enum-valued reading, so it keeps explicit
564
+ * presence — but the named constants for its numbers. A connector maps its maker's codes onto
565
+ * these; a code none of them names is OTHER.
566
+ *
567
+ * @generated from enum kusinta.iot.device.v1.HeatSourceProduction
568
+ */
569
+ export enum HeatSourceProduction {
570
+ /**
571
+ * Never sent; an unreported state is an absent field.
572
+ *
573
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_UNSPECIFIED = 0;
574
+ */
575
+ UNSPECIFIED = 0,
576
+
577
+ /**
578
+ * Producing nothing.
579
+ *
580
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_OFF = 1;
581
+ */
582
+ OFF = 1,
583
+
584
+ /**
585
+ * Heating the building: its climate systems.
586
+ *
587
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_SPACE_HEATING = 2;
588
+ */
589
+ SPACE_HEATING = 2,
590
+
591
+ /**
592
+ * Making hot water.
593
+ *
594
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_HOT_WATER = 3;
595
+ */
596
+ HOT_WATER = 3,
597
+
598
+ /**
599
+ * Heating a pool.
600
+ *
601
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_POOL = 4;
602
+ */
603
+ POOL = 4,
604
+
605
+ /**
606
+ * Cooling.
607
+ *
608
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_COOLING = 5;
609
+ */
610
+ COOLING = 5,
611
+
612
+ /**
613
+ * Something none of the above names, such as a transfer between stores.
614
+ *
615
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_OTHER = 6;
616
+ */
617
+ OTHER = 6,
618
+ }
619
+
620
+ /**
621
+ * Describes the enum kusinta.iot.device.v1.HeatSourceProduction.
622
+ */
623
+ export declare const HeatSourceProductionSchema: GenEnum<HeatSourceProduction>;
624
+
625
+ /**
626
+ * The value set of HeatSourceReadings.compressor_state, as the named constants for its
627
+ * numbers. Starting and stopping are kept apart from running and stopped: while a compressor
628
+ * starts, the heat it makes has not yet reached the supply, and readings then are not yet what
629
+ * it runs at.
630
+ *
631
+ * @generated from enum kusinta.iot.device.v1.CompressorState
632
+ */
633
+ export enum CompressorState {
634
+ /**
635
+ * Never sent; an unreported state is an absent field.
636
+ *
637
+ * @generated from enum value: COMPRESSOR_STATE_UNSPECIFIED = 0;
638
+ */
639
+ UNSPECIFIED = 0,
640
+
641
+ /**
642
+ * @generated from enum value: COMPRESSOR_STATE_STOPPED = 1;
643
+ */
644
+ STOPPED = 1,
645
+
646
+ /**
647
+ * @generated from enum value: COMPRESSOR_STATE_STARTING = 2;
648
+ */
649
+ STARTING = 2,
650
+
651
+ /**
652
+ * @generated from enum value: COMPRESSOR_STATE_RUNNING = 3;
653
+ */
654
+ RUNNING = 3,
655
+
656
+ /**
657
+ * @generated from enum value: COMPRESSOR_STATE_STOPPING = 4;
658
+ */
659
+ STOPPING = 4,
660
+
661
+ /**
662
+ * Stopped and held off: the heat source says its compressor is blocked, for whatever reason
663
+ * it has (an external input, a low outdoor temperature, its own restart delay, an alarm).
664
+ * Not a statement of why.
665
+ *
666
+ * @generated from enum value: COMPRESSOR_STATE_BLOCKED = 5;
667
+ */
668
+ BLOCKED = 5,
669
+ }
670
+
671
+ /**
672
+ * Describes the enum kusinta.iot.device.v1.CompressorState.
673
+ */
674
+ export declare const CompressorStateSchema: GenEnum<CompressorState>;
675
+
676
+ /**
677
+ * The value set of RadioLink.quality: how well a link is doing, as the device's
678
+ * connector rates it. Not a field type — quality is a uint32 like every enum-valued
679
+ * reading, so it keeps explicit presence — but the named constants for its numbers.
680
+ * Defined here, unlike the HomeMatic enum parameters, because this vocabulary is the
681
+ * schema's own rather than an upstream system's.
682
+ *
683
+ * The rating is radio-specific and made by the connector that reaches the device, from
684
+ * whatever its technology measures; the thresholds behind it are not part of this
685
+ * contract and may differ between technologies. A consumer shows the rating, and treats
686
+ * the raw readings as detail.
687
+ *
688
+ * @generated from enum kusinta.iot.device.v1.RadioQuality
689
+ */
690
+ export enum RadioQuality {
691
+ /**
692
+ * Never sent; an unreported quality is an absent field.
693
+ *
694
+ * @generated from enum value: RADIO_QUALITY_UNSPECIFIED = 0;
695
+ */
696
+ UNSPECIFIED = 0,
697
+
698
+ /**
699
+ * @generated from enum value: RADIO_QUALITY_GOOD = 1;
700
+ */
701
+ GOOD = 1,
702
+
703
+ /**
704
+ * @generated from enum value: RADIO_QUALITY_FAIR = 2;
705
+ */
706
+ FAIR = 2,
707
+
708
+ /**
709
+ * @generated from enum value: RADIO_QUALITY_POOR = 3;
710
+ */
711
+ POOR = 3,
712
+ }
713
+
714
+ /**
715
+ * Describes the enum kusinta.iot.device.v1.RadioQuality.
716
+ */
717
+ export declare const RadioQualitySchema: GenEnum<RadioQuality>;
718
+