@kusinta/iot-schema 0.2.0-beta.4 → 0.2.0-beta.41

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 (69) hide show
  1. package/package.json +13 -1
  2. package/src/kusinta/iot/access/v1/acl_pb.d.ts +120 -2
  3. package/src/kusinta/iot/access/v1/acl_pb.js +20 -3
  4. package/src/kusinta/iot/access/v1/roles_pb.d.ts +157 -4
  5. package/src/kusinta/iot/access/v1/roles_pb.js +125 -5
  6. package/src/kusinta/iot/accountlink/v1/account_link_pb.d.ts +583 -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 +1041 -0
  9. package/src/kusinta/iot/climate/v1/climate_pb.js +206 -0
  10. package/src/kusinta/iot/commissioning/v1/commissioning_pb.d.ts +1280 -0
  11. package/src/kusinta/iot/commissioning/v1/commissioning_pb.js +275 -0
  12. package/src/kusinta/iot/common/v1/pairing_pb.d.ts +217 -0
  13. package/src/kusinta/iot/common/v1/pairing_pb.js +50 -0
  14. package/src/kusinta/iot/common/v1/types_pb.d.ts +232 -0
  15. package/src/kusinta/iot/common/v1/types_pb.js +84 -2
  16. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +691 -2
  17. package/src/kusinta/iot/connector/v1/connector_pb.js +104 -13
  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 +33 -3
  21. package/src/kusinta/iot/device/v1/descriptor_pb.js +2 -1
  22. package/src/kusinta/iot/device/v1/device_event_pb.d.ts +87 -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 +164 -11
  25. package/src/kusinta/iot/device/v1/device_pb.js +33 -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 +28 -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 +619 -0
  31. package/src/kusinta/iot/heating/v1/heating_pb.js +118 -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/registration/v1/registration_pb.d.ts +18 -0
  35. package/src/kusinta/iot/registration/v1/registration_pb.js +1 -1
  36. package/src/kusinta/iot/reporting/v1/reporting_pb.d.ts +1228 -0
  37. package/src/kusinta/iot/reporting/v1/reporting_pb.js +238 -0
  38. package/src/kusinta/iot/reporting/v1/reporting_service_pb.d.ts +63 -0
  39. package/src/kusinta/iot/reporting/v1/reporting_service_pb.js +24 -0
  40. package/src/kusinta/iot/signaling/v1/signaling_pb.d.ts +936 -7
  41. package/src/kusinta/iot/signaling/v1/signaling_pb.js +163 -4
  42. package/src/kusinta/iot/signaling/v1/signaling_service_pb.d.ts +24 -1
  43. package/src/kusinta/iot/signaling/v1/signaling_service_pb.js +1 -1
  44. package/src/kusinta/iot/space/v1/space_pb.d.ts +129 -2
  45. package/src/kusinta/iot/space/v1/space_pb.js +10 -1
  46. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +19 -3
  47. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +1 -1
  48. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.d.ts +69 -0
  49. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js +19 -0
  50. package/src/kusinta/iot/vendor/v1/vendor_options_pb.d.ts +4 -4
  51. package/src/kusinta/iot/vendor/v1/vendor_options_pb.js +4 -4
  52. package/src/kusinta/iot/webrtc/v1/app_token_pb.d.ts +48 -5
  53. package/src/kusinta/iot/webrtc/v1/app_token_pb.js +1 -1
  54. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +56 -0
  55. package/src/kusinta/iot/webrtc/v1/command_pb.js +1 -1
  56. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +179 -5
  57. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +35 -6
  58. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +664 -3
  59. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +69 -3
  60. package/src/kusinta/iot/webrtc/v1/household_pb.d.ts +490 -0
  61. package/src/kusinta/iot/webrtc/v1/household_pb.js +120 -0
  62. package/src/kusinta/iot/webrtc/v1/invite_pb.d.ts +502 -0
  63. package/src/kusinta/iot/webrtc/v1/invite_pb.js +108 -0
  64. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +1944 -76
  65. package/src/kusinta/iot/webrtc/v1/management_pb.js +297 -5
  66. package/src/kusinta/iot/webrtc/v1/members_pb.d.ts +578 -0
  67. package/src/kusinta/iot/webrtc/v1/members_pb.js +113 -0
  68. package/src/kusinta/iot/webrtc/v1/permission_push_pb.d.ts +66 -4
  69. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +10 -2
@@ -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,79 @@ 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 — it is
132
+ * unset instead, and follows_loss then looks no further back either. Otherwise it is the
133
+ * event_number of the previous event of this device that this user was due — within the
134
+ * grant they held when it happened — whether or not any session of theirs was open to be
135
+ * sent it, so that events missed while away are a gap like any other. A number of the
136
+ * event's own numbering_id. Unset when the gateway has received no such event under that
137
+ * numbering since the gateway itself last started — the first event after a numbering
138
+ * restart included: continuity is then unknown. The gateway remembers nothing of a
139
+ * numbering across its own restart, so follows_loss too covers only what it received
140
+ * since, and a resend it can no longer recognise reaches the app: an app drops an event
141
+ * whose number is at or below the last it holds for the device under the same
142
+ * numbering_id.
143
+ *
144
+ * @generated from field: optional uint64 previous_event_number = 9;
145
+ */
146
+ previousEventNumber?: bigint | undefined;
147
+
148
+ /**
149
+ * Set when the gateway itself missed events of this device since previous_event_number —
150
+ * or, when that is unset, since the latest of the start of what the user may learn of the
151
+ * device, the start of the current numbering and the gateway's own last start — the
152
+ * sequence it receives from the device skipped. A restart of the numbering is not itself
153
+ * a loss; a connector shows what it lost by skipping numbers. What was lost is unknown,
154
+ * so it may have been an event this recipient would have been sent.
155
+ *
156
+ * @generated from field: bool follows_loss = 10;
157
+ */
158
+ followsLoss: boolean;
159
+
160
+ /**
161
+ * Which numbering event_number belongs to. A connector changes it whenever it restarts a
162
+ * device's numbering — after losing its own count — so that a restart is never mistaken
163
+ * for a resend. The gateway then begins a new sequence for the device: the first event of
164
+ * it that each user is due carries previous_event_number unset, continuity unknown. A new
165
+ * value is one never used before for the device — a UUIDv4 is the expected form. Opaque;
166
+ * compare for equality only. Empty is a numbering like any other, for a connector whose
167
+ * count for a device never restarts; a connector that begins a device's sequence anew —
168
+ * having lost its count, or the device having come back to it — must give it a
169
+ * numbering_id never used for that device before. Every numbering starts at 1. On the app leg
170
+ * the gateway derives it from the connector's own id and the connector's numbering_id
171
+ * alone, so that it is the same across a gateway restart and changes whenever either
172
+ * does — a numbering restart, or a device moving to another connector.
173
+ *
174
+ * @generated from field: string numbering_id = 11;
175
+ */
176
+ numberingId: string;
95
177
  };
96
178
 
97
179
  /**
@@ -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,7 @@ 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) outside that oneof.
29
29
  *
30
30
  * endpoint_id is Matter's own endpoint number, and it is scoped to ONE DEVICE — not
31
31
  * global, and nothing coordinates numbering between devices. Endpoint 1 on one valve and
@@ -181,6 +181,18 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
181
181
  case: "hmMaintenance";
182
182
  } | { case: undefined; value?: undefined };
183
183
 
184
+ /**
185
+ * How well this device's radio link is doing, on whichever endpoint its connector
186
+ * reports it. Outside vendor_properties on purpose: it is not a vendor's extension of
187
+ * one device type but a reading any radio device has, so it must be able to sit beside
188
+ * whichever vendor case the endpoint already carries — on a HomeMatic device's Power
189
+ * Source endpoint, beside hm_maintenance. Selected by the vendor branch like a
190
+ * vendor_properties case, by its (vendor_extension) key "kusinta.radio".
191
+ *
192
+ * @generated from field: kusinta.iot.device.v1.RadioLink radio_link = 52;
193
+ */
194
+ radioLink?: RadioLink | undefined;
195
+
184
196
  /**
185
197
  * Every cluster this endpoint hosts: what it supports, and any attribute value that has
186
198
  * no typed field above. This is what makes a device the schema does not model usable
@@ -195,14 +207,17 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
195
207
  clusters: ClusterState[];
196
208
 
197
209
  /**
198
- * Which vendor parameters this endpoint's vendor extension actually implements, in the
210
+ * Which vendor parameters this endpoint's vendor extensions actually implement, in the
199
211
  * vendor's own spelling — "SABOTAGE", matching (vendor_attribute) byte for byte.
200
212
  *
201
213
  * The vendor mirror of ClusterState.attribute_ids, and it needs its own field because a
202
214
  * 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.
215
+ * rather than an id list because the vendor branch addresses by name. A bare list
216
+ * 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.
206
221
  *
207
222
  * Same reading as the Matter side: named here with no value = implemented, not yet
208
223
  * reported. Absent from the list = this device does not have it. Empty = not stated,
@@ -215,6 +230,18 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
215
230
  * @generated from field: repeated string vendor_attribute_names = 17;
216
231
  */
217
232
  vendorAttributeNames: string[];
233
+
234
+ /**
235
+ * What a write to each vendor parameter leaves behind, and how late its reports arrive,
236
+ * keyed by the parameter's vendor name as vendor_attribute_names spells it. The vendor
237
+ * mirror of ClusterState.attribute_behaviours, with the same rules: an absent key is
238
+ * "not stated", and not stated is read as the worst case. For a parameter reached through
239
+ * a vendor's service, the name is the vendor's stable parameter id where it has one,
240
+ * never a display name that is translated or renamed between firmware versions.
241
+ *
242
+ * @generated from field: map<string, kusinta.iot.device.v1.AttributeBehaviour> vendor_attribute_behaviours = 18;
243
+ */
244
+ vendorAttributeBehaviours: { [key: string]: AttributeBehaviour };
218
245
  };
219
246
 
220
247
  /**
@@ -246,15 +273,43 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
246
273
  descriptor?: DeviceDescriptor | undefined;
247
274
 
248
275
  /**
249
- * 15-19 are free; 20+ is the timestamp band.
276
+ * 17-19 are free; 20+ is the timestamp band.
250
277
  *
251
278
  * @generated from field: repeated kusinta.iot.device.v1.Endpoint endpoints = 14;
252
279
  */
253
280
  endpoints: Endpoint[];
254
281
 
255
282
  /**
256
- * When the gateway last had evidence this device exists and is reachable — the
257
- * most recent PropertyUpdate, announcement, or command result concerning it.
283
+ * The fewest seconds this device needs between two writes, to any of its attributes on
284
+ * any endpoint, without dropping one: a radio limited to a share of airtime, a battery
285
+ * device that wakes on a schedule. A device-wide budget rather than a per-attribute one,
286
+ * because two attributes each written at their own pace still share one radio. Stated by
287
+ * the producer at announcement. Absent: not stated, never zero.
288
+ *
289
+ * A lower bound, not the whole budget: devices behind one radio gateway or one hub share
290
+ * its airtime, and a vendor's service limits an account rather than a device, so a writer
291
+ * may have to space writes further apart than this says.
292
+ *
293
+ * @generated from field: optional uint32 min_write_interval_seconds = 15;
294
+ */
295
+ minWriteIntervalSeconds?: number | undefined;
296
+
297
+ /**
298
+ * The longest a write can take to reach the device: a device that listens only after
299
+ * its own report takes a write at its next one. Stated by the producer at announcement.
300
+ * Absent: not stated, never zero. A writer that renews a lease renews it this long, plus
301
+ * a margin, before the lease runs out, or the output lapses between renewals.
302
+ *
303
+ * @generated from field: optional uint32 max_write_delay_seconds = 16;
304
+ */
305
+ maxWriteDelaySeconds?: number | undefined;
306
+
307
+ /**
308
+ * When the gateway last had evidence this device itself — the
309
+ * most recent PropertyUpdate (wheter or not the property changed) or command
310
+ * result concerning it. Should not be advanced on a device announcement: a
311
+ * connector typically re-announces from its own device list, so a device with a
312
+ * flat battery would otherwise keep looking freshly seen.
258
313
  * Gateway-observed, not connector-reported: no message on either leg carries a
259
314
  * per-device liveness timestamp, so this is as precise as the device's own report
260
315
  * interval. A device that reports every 15 minutes looks stale for 15 minutes.
@@ -265,12 +320,20 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
265
320
  * Advisory, for showing staleness in a UI. It is not a removal signal — that is
266
321
  * webrtc.v1.DeviceRemoved, sent only when a connector reports the device gone.
267
322
  *
323
+ * Unset in a service view (access.v1.DeviceAcl.relation SERVICE): a device that reports on
324
+ * change would give away each opening and each turn of a knob. Service learns whether it
325
+ * is reachable from webrtc.v1.ServiceStatus.
326
+ *
268
327
  * @generated from field: google.protobuf.Timestamp last_seen = 20;
269
328
  */
270
329
  lastSeen?: Timestamp | undefined;
271
330
 
272
331
  /**
273
- * When any field of this Device last changed value.
332
+ * When any field of this Device last changed value. Unset in a service view, for the
333
+ * reason last_seen is. Both are also unset when they date from before the recipient's
334
+ * current residency in the home, or from a home they did not live in at the time (see
335
+ * access.v1.MembershipRelation).
336
+ * Whether such a device is reachable is still told by its webrtc.v1.ServiceStatus.
274
337
  *
275
338
  * @generated from field: google.protobuf.Timestamp last_updated = 21;
276
339
  */
@@ -283,3 +346,93 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
283
346
  */
284
347
  export declare const DeviceSchema: GenMessage<Device>;
285
348
 
349
+ /**
350
+ * A device's radio link, as its connector reports it.
351
+ *
352
+ * Travels as vendor-branch PropertyUpdates with vendor_extension "kusinta.radio" and
353
+ * these attribute names, the value case following the field type as everywhere on the
354
+ * vendor branch: "quality" as uint_value, "rssi_dbm" as int_value, "snr_db" as
355
+ * float_value.
356
+ *
357
+ * Every field is `optional`, for the reason vendor readings always are: absent means
358
+ * never reported, present means a reading.
359
+ *
360
+ * Technology-agnostic: the same message for every radio. A vendor's own raw radio
361
+ * readings, such as HmMaintenanceProps.rssi_device, stay in that vendor's extension.
362
+ *
363
+ * @generated from message kusinta.iot.device.v1.RadioLink
364
+ */
365
+ export declare type RadioLink = Message<"kusinta.iot.device.v1.RadioLink"> & {
366
+ /**
367
+ * The connector's rating: GOOD = 1, FAIR = 2, POOR = 3 (RadioQuality); 0 is not used.
368
+ * A number, not the name, as every enum-valued reading travels.
369
+ *
370
+ * @generated from field: optional uint32 quality = 1;
371
+ */
372
+ quality?: number | undefined;
373
+
374
+ /**
375
+ * Received signal strength in dBm. sint32: negative in normal operation.
376
+ *
377
+ * @generated from field: optional sint32 rssi_dbm = 2;
378
+ */
379
+ rssiDbm?: number | undefined;
380
+
381
+ /**
382
+ * Signal-to-noise ratio in dB, for technologies that measure one — LoRaWAN does.
383
+ * Absent elsewhere. Negative values are normal for LoRa.
384
+ *
385
+ * @generated from field: optional float snr_db = 3;
386
+ */
387
+ snrDb?: number | undefined;
388
+ };
389
+
390
+ /**
391
+ * Describes the message kusinta.iot.device.v1.RadioLink.
392
+ * Use `create(RadioLinkSchema)` to create a new message.
393
+ */
394
+ export declare const RadioLinkSchema: GenMessage<RadioLink>;
395
+
396
+ /**
397
+ * The value set of RadioLink.quality: how well a link is doing, as the device's
398
+ * connector rates it. Not a field type — quality is a uint32 like every enum-valued
399
+ * reading, so it keeps explicit presence — but the named constants for its numbers.
400
+ * Defined here, unlike the HomeMatic enum parameters, because this vocabulary is the
401
+ * schema's own rather than an upstream system's.
402
+ *
403
+ * The rating is radio-specific and made by the connector that reaches the device, from
404
+ * whatever its technology measures; the thresholds behind it are not part of this
405
+ * contract and may differ between technologies. A consumer shows the rating, and treats
406
+ * the raw readings as detail.
407
+ *
408
+ * @generated from enum kusinta.iot.device.v1.RadioQuality
409
+ */
410
+ export enum RadioQuality {
411
+ /**
412
+ * Never sent; an unreported quality is an absent field.
413
+ *
414
+ * @generated from enum value: RADIO_QUALITY_UNSPECIFIED = 0;
415
+ */
416
+ UNSPECIFIED = 0,
417
+
418
+ /**
419
+ * @generated from enum value: RADIO_QUALITY_GOOD = 1;
420
+ */
421
+ GOOD = 1,
422
+
423
+ /**
424
+ * @generated from enum value: RADIO_QUALITY_FAIR = 2;
425
+ */
426
+ FAIR = 2,
427
+
428
+ /**
429
+ * @generated from enum value: RADIO_QUALITY_POOR = 3;
430
+ */
431
+ POOR = 3,
432
+ }
433
+
434
+ /**
435
+ * Describes the enum kusinta.iot.device.v1.RadioQuality.
436
+ */
437
+ export declare const RadioQualitySchema: GenEnum<RadioQuality>;
438
+
@@ -2,18 +2,19 @@
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 { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
5
+ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
6
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
7
7
  import { file_kusinta_iot_device_v1_cluster_state } from "./cluster_state_pb.js";
8
8
  import { file_kusinta_iot_device_v1_descriptor } from "./descriptor_pb.js";
9
9
  import { file_kusinta_iot_device_v1_properties } from "./properties_pb.js";
10
10
  import { file_kusinta_iot_vendor_homematic_v1_homematic } from "../../vendor/homematic/v1/homematic_pb.js";
11
+ import { file_kusinta_iot_vendor_v1_vendor_options } from "../../vendor/v1/vendor_options_pb.js";
11
12
 
12
13
  /**
13
14
  * Describes the file kusinta/iot/device/v1/device.proto.
14
15
  */
15
16
  export const file_kusinta_iot_device_v1_device = /*@__PURE__*/
16
- fileDesc("CiJrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEinQoKCEVuZHBvaW50EhMKC2VuZHBvaW50X2lkGAEgASgNEh0KFW1hdHRlcl9kZXZpY2VfdHlwZV9pZBgCIAEoDRJBCgp0aGVybW9zdGF0GAMgASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRoZXJtb3N0YXRQcm9wZXJ0aWVzSAASUAoSdGVtcGVyYXR1cmVfc2Vuc29yGAQgASgLMjIua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllc0gAEkoKD2h1bWlkaXR5X3NlbnNvchgFIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5IdW1pZGl0eVNlbnNvclByb3BlcnRpZXNIABJMChBvY2N1cGFuY3lfc2Vuc29yGAYgASgLMjAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXNIABJICg5jb250YWN0X3NlbnNvchgHIAEoCzIuLmt1c2ludGEuaW90LmRldmljZS52MS5Db250YWN0U2Vuc29yUHJvcGVydGllc0gAEkoKD3dpbmRvd19jb3ZlcmluZxgIIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5XaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXNIABI+Cglkb29yX2xvY2sYCSABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRG9vckxvY2tQcm9wZXJ0aWVzSAASQwoMb25fb2ZmX2xpZ2h0GAogASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9uT2ZmTGlnaHRQcm9wZXJ0aWVzSAASSAoOZGltbWFibGVfbGlnaHQYCyABKAsyLi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGltbWFibGVMaWdodFByb3BlcnRpZXNIABJSChBjb2xvcl90ZW1wX2xpZ2h0GAwgASgLMjYua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNvbG9yVGVtcGVyYXR1cmVMaWdodFByb3BlcnRpZXNIABJGCg1lbmVyZ3lfc2Vuc29yGA0gASgLMi0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkVuZXJneVNlbnNvclByb3BlcnRpZXNIABJKCg9wcmVzc3VyZV9zZW5zb3IYDiABKAsyLy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJlc3N1cmVTZW5zb3JQcm9wZXJ0aWVzSAASRAoMcG93ZXJfc291cmNlGA8gASgLMiwua3VzaW50YS5pb3QuZGV2aWNlLnYxLlBvd2VyU291cmNlUHJvcGVydGllc0gAEksKDWhtX3RoZXJtb3N0YXQYMiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtVGhlcm1vc3RhdFByb3BzSAESTQoOaG1fbWFpbnRlbmFuY2UYMyABKAsyMy5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtTWFpbnRlbmFuY2VQcm9wc0gBEjUKCGNsdXN0ZXJzGBAgAygLMiMua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNsdXN0ZXJTdGF0ZRIeChZ2ZW5kb3JfYXR0cmlidXRlX25hbWVzGBEgAygJQhMKEW1hdHRlcl9wcm9wZXJ0aWVzQhMKEXZlbmRvcl9wcm9wZXJ0aWVzIrADCgZEZXZpY2USOwoKZGVzY3JpcHRvchgBIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VEZXNjcmlwdG9yEjIKCWVuZHBvaW50cxgOIAMoCzIfLmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludBItCglsYXN0X3NlZW4YFCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjAKDGxhc3RfdXBkYXRlZBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBKBAgCEA5KBAgyEDNSCnRoZXJtb3N0YXRSEnRlbXBlcmF0dXJlX3NlbnNvclIPaHVtaWRpdHlfc2Vuc29yUhBvY2N1cGFuY3lfc2Vuc29yUg5jb250YWN0X3NlbnNvclIPd2luZG93X2NvdmVyaW5nUglkb29yX2xvY2tSDG9uX29mZl9saWdodFIOZGltbWFibGVfbGlnaHRSEGNvbG9yX3RlbXBfbGlnaHRSDWVuZXJneV9zZW5zb3JSD3ByZXNzdXJlX3NlbnNvclIJaG9tZW1hdGljQgJIAWIGcHJvdG8z", [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]);
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
18
 
18
19
  /**
19
20
  * Describes the message kusinta.iot.device.v1.Endpoint.
@@ -29,3 +30,33 @@ export const EndpointSchema = /*@__PURE__*/
29
30
  export const DeviceSchema = /*@__PURE__*/
30
31
  messageDesc(file_kusinta_iot_device_v1_device, 1);
31
32
 
33
+ /**
34
+ * Describes the message kusinta.iot.device.v1.RadioLink.
35
+ * Use `create(RadioLinkSchema)` to create a new message.
36
+ */
37
+ export const RadioLinkSchema = /*@__PURE__*/
38
+ messageDesc(file_kusinta_iot_device_v1_device, 2);
39
+
40
+ /**
41
+ * Describes the enum kusinta.iot.device.v1.RadioQuality.
42
+ */
43
+ export const RadioQualitySchema = /*@__PURE__*/
44
+ enumDesc(file_kusinta_iot_device_v1_device, 0);
45
+
46
+ /**
47
+ * The value set of RadioLink.quality: how well a link is doing, as the device's
48
+ * connector rates it. Not a field type — quality is a uint32 like every enum-valued
49
+ * reading, so it keeps explicit presence — but the named constants for its numbers.
50
+ * Defined here, unlike the HomeMatic enum parameters, because this vocabulary is the
51
+ * schema's own rather than an upstream system's.
52
+ *
53
+ * The rating is radio-specific and made by the connector that reaches the device, from
54
+ * whatever its technology measures; the thresholds behind it are not part of this
55
+ * contract and may differ between technologies. A consumer shows the rating, and treats
56
+ * the raw readings as detail.
57
+ *
58
+ * @generated from enum kusinta.iot.device.v1.RadioQuality
59
+ */
60
+ export const RadioQuality = /*@__PURE__*/
61
+ tsEnum(RadioQualitySchema);
62
+
@@ -475,16 +475,23 @@ export declare const ColorTemperatureLightPropertiesSchema: GenMessage<ColorTemp
475
475
  * Hz × 100) while their (matter_attribute) claimed to carry the Matter attribute, so every
476
476
  * connector had to divide, every consumer trusting the annotation was wrong by 10× to 1000×,
477
477
  * and sub-watt resolution was gone before the value reached the wire. In Matter's mW an
478
- * int32 caps at ~2.1 kW, so the unit and the width had to move together.
478
+ * int32 caps at ~2.1 MW, enough for a home but not for every Matter device, and Matter
479
+ * types these attributes int64, so the width follows the specification.
479
480
  *
480
481
  * Signed throughout, matching the cluster: active_power and active_current go negative on
481
482
  * export. sint64 rather than int64 because zigzag keeps negatives at 1-5 bytes instead of
482
483
  * the fixed 10 that int64 spends on any negative value.
483
484
  *
484
- * Matter types these as nullable. This schema has no presence anywhere in properties, so 0
485
- * still means "not reported" rather than "measured zero" — unchanged, and untidy for a
486
- * quantity that can legitimately read zero. Treat 0 as absent for these four; introducing
487
- * presence is a schema-wide decision, not a per-message one.
485
+ * Matter types these as nullable, and every field here carries explicit presence: unset is
486
+ * "not reported", and 0 is a measured zero — a relay that is off reads 0 W, never the last
487
+ * non-zero power. A reported null (PropertyUpdate.null_value) unsets the field.
488
+ *
489
+ * The cumulative energy counters come from Electrical Energy Measurement (0x0091), the
490
+ * other measurement cluster of the Electrical Sensor device type: the energy of Matter's
491
+ * EnergyMeasurementStruct, in milliwatt-hours, never negative, so uint64. The struct's
492
+ * start and end times are not carried; a reading is as of its report. A counter only
493
+ * climbs: a reading lower than the one before is a reset, and consumption is counted
494
+ * again from it, never as a negative difference.
488
495
  *
489
496
  * @generated from message kusinta.iot.device.v1.EnergySensorProperties
490
497
  */
@@ -516,6 +523,20 @@ export declare type EnergySensorProperties = Message<"kusinta.iot.device.v1.Ener
516
523
  * @generated from field: optional sint64 frequency = 8;
517
524
  */
518
525
  frequency?: bigint | undefined;
526
+
527
+ /**
528
+ * Milliwatt-hours taken from the grid or the supply since the counter began.
529
+ *
530
+ * @generated from field: optional uint64 cumulative_energy_imported = 9;
531
+ */
532
+ cumulativeEnergyImported?: bigint | undefined;
533
+
534
+ /**
535
+ * Milliwatt-hours delivered to the grid since the counter began, kept apart from import.
536
+ *
537
+ * @generated from field: optional uint64 cumulative_energy_exported = 10;
538
+ */
539
+ cumulativeEnergyExported?: bigint | undefined;
519
540
  };
520
541
 
521
542
  /**
@@ -9,7 +9,7 @@ import { file_kusinta_iot_device_v1_matter_options } from "./matter_options_pb.j
9
9
  * Describes the file kusinta/iot/device/v1/properties.proto.
10
10
  */
11
11
  export const file_kusinta_iot_device_v1_properties = /*@__PURE__*/
12
- fileDesc("CiZrdXNpbnRhL2lvdC9kZXZpY2UvdjEvcHJvcGVydGllcy5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIv8IChRUaGVybW9zdGF0UHJvcGVydGllcxJBChFsb2NhbF90ZW1wZXJhdHVyZRgBIAEoEUIhiLUYgQSStRgQTG9jYWxUZW1wZXJhdHVyZbC1GADItRgFSACIAQESUAoZb2NjdXBpZWRfaGVhdGluZ19zZXRwb2ludBgCIAEoEUIoiLUYgQSStRgXT2NjdXBpZWRIZWF0aW5nU2V0cG9pbnSwtRgSyLUYB0gBiAEBElAKGW9jY3VwaWVkX2Nvb2xpbmdfc2V0cG9pbnQYAyABKBFCKIi1GIEEkrUYF09jY3VwaWVkQ29vbGluZ1NldHBvaW50sLUYEci1GAdIAogBARJLChdtaW5faGVhdF9zZXRwb2ludF9saW1pdBgEIAEoEUIliLUYgQSStRgUTWluSGVhdFNldHBvaW50TGltaXSwtRgVyLUYB0gDiAEBEksKF21heF9oZWF0X3NldHBvaW50X2xpbWl0GAUgASgRQiWItRiBBJK1GBRNYXhIZWF0U2V0cG9pbnRMaW1pdLC1GBbItRgHSASIAQESSwoXbWluX2Nvb2xfc2V0cG9pbnRfbGltaXQYBiABKBFCJYi1GIEEkrUYFE1pbkNvb2xTZXRwb2ludExpbWl0sLUYF8i1GAdIBYgBARJLChdtYXhfY29vbF9zZXRwb2ludF9saW1pdBgHIAEoEUIliLUYgQSStRgUTWF4Q29vbFNldHBvaW50TGltaXSwtRgYyLUYB0gGiAEBElcKHWNvbnRyb2xfc2VxdWVuY2Vfb2Zfb3BlcmF0aW9uGAggASgNQiuItRiBBJK1GBpDb250cm9sU2VxdWVuY2VPZk9wZXJhdGlvbrC1GBvItRgHSAeIAQESNQoLc3lzdGVtX21vZGUYCSABKA1CG4i1GIEEkrUYClN5c3RlbU1vZGWwtRgcyLUYB0gIiAEBEkwKF3RoZXJtb3N0YXRfcnVubmluZ19tb2RlGAogASgNQiaItRiBBJK1GBVUaGVybW9zdGF0UnVubmluZ01vZGWwtRgeyLUYBUgJiAEBEkAKEXBpX2hlYXRpbmdfZGVtYW5kGAsgASgNQiCItRiBBJK1GA9QSUhlYXRpbmdEZW1hbmSwtRgIyLUYBUgKiAEBOgaatRgCgQZCFAoSX2xvY2FsX3RlbXBlcmF0dXJlQhwKGl9vY2N1cGllZF9oZWF0aW5nX3NldHBvaW50QhwKGl9vY2N1cGllZF9jb29saW5nX3NldHBvaW50QhoKGF9taW5faGVhdF9zZXRwb2ludF9saW1pdEIaChhfbWF4X2hlYXRfc2V0cG9pbnRfbGltaXRCGgoYX21pbl9jb29sX3NldHBvaW50X2xpbWl0QhoKGF9tYXhfY29vbF9zZXRwb2ludF9saW1pdEIgCh5fY29udHJvbF9zZXF1ZW5jZV9vZl9vcGVyYXRpb25CDgoMX3N5c3RlbV9tb2RlQhoKGF90aGVybW9zdGF0X3J1bm5pbmdfbW9kZUIUChJfcGlfaGVhdGluZ19kZW1hbmQi7QIKG1RlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllcxI7Cg5tZWFzdXJlZF92YWx1ZRgBIAEoEUIeiLUYggiStRgNTWVhc3VyZWRWYWx1ZbC1GADItRgFSACIAQESQgoSbWluX21lYXN1cmVkX3ZhbHVlGAIgASgRQiGItRiCCJK1GBBNaW5NZWFzdXJlZFZhbHVlsLUYAci1GAVIAYgBARJCChJtYXhfbWVhc3VyZWRfdmFsdWUYAyABKBFCIYi1GIIIkrUYEE1heE1lYXN1cmVkVmFsdWWwtRgCyLUYBUgCiAEBEjIKCXRvbGVyYW5jZRgEIAEoDUIaiLUYggiStRgJVG9sZXJhbmNlsLUYA8i1GAVIA4gBAToGmrUYAoIGQhEKD19tZWFzdXJlZF92YWx1ZUIVChNfbWluX21lYXN1cmVkX3ZhbHVlQhUKE19tYXhfbWVhc3VyZWRfdmFsdWVCDAoKX3RvbGVyYW5jZSLqAgoYSHVtaWRpdHlTZW5zb3JQcm9wZXJ0aWVzEjsKDm1lYXN1cmVkX3ZhbHVlGAEgASgNQh6ItRiFCJK1GA1NZWFzdXJlZFZhbHVlsLUYAMi1GAVIAIgBARJCChJtaW5fbWVhc3VyZWRfdmFsdWUYAiABKA1CIYi1GIUIkrUYEE1pbk1lYXN1cmVkVmFsdWWwtRgByLUYBUgBiAEBEkIKEm1heF9tZWFzdXJlZF92YWx1ZRgDIAEoDUIhiLUYhQiStRgQTWF4TWVhc3VyZWRWYWx1ZbC1GALItRgFSAKIAQESMgoJdG9sZXJhbmNlGAQgASgNQhqItRiFCJK1GAlUb2xlcmFuY2WwtRgDyLUYBUgDiAEBOgaatRgChwZCEQoPX21lYXN1cmVkX3ZhbHVlQhUKE19taW5fbWVhc3VyZWRfdmFsdWVCFQoTX21heF9tZWFzdXJlZF92YWx1ZUIMCgpfdG9sZXJhbmNlIvcEChlPY2N1cGFuY3lTZW5zb3JQcm9wZXJ0aWVzEjIKCW9jY3VwYW5jeRgBIAEoDUIaiLUYhgiStRgJT2NjdXBhbmN5sLUYAMi1GAVIAIgBARJIChVvY2N1cGFuY3lfc2Vuc29yX3R5cGUYAiABKA1CJIi1GIYIkrUYE09jY3VwYW5jeVNlbnNvclR5cGWwtRgByLUYBUgBiAEBElUKHG9jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXAYAyABKA1CKoi1GIYIkrUYGU9jY3VwYW5jeVNlbnNvclR5cGVCaXRtYXCwtRgCyLUYBUgCiAEBElwKIHBpcl9vY2N1cGllZF90b191bm9jY3VwaWVkX2RlbGF5GAQgASgNQi2ItRiGCJK1GBxQSVJPY2N1cGllZFRvVW5vY2N1cGllZERlbGF5sLUYEMi1GAdIA4gBARJcCiBwaXJfdW5vY2N1cGllZF90b19vY2N1cGllZF9kZWxheRgFIAEoDUItiLUYhgiStRgcUElSVW5vY2N1cGllZFRvT2NjdXBpZWREZWxhebC1GBHItRgHSASIAQE6Bpq1GAKHAkIMCgpfb2NjdXBhbmN5QhgKFl9vY2N1cGFuY3lfc2Vuc29yX3R5cGVCHwodX29jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXBCIwohX3Bpcl9vY2N1cGllZF90b191bm9jY3VwaWVkX2RlbGF5QiMKIV9waXJfdW5vY2N1cGllZF90b19vY2N1cGllZF9kZWxheVIWcGlyX29jY190b191bm9jY19kZWxheVIWcGlyX3Vub2NjX3RvX29jY19kZWxheSJmChdDb250YWN0U2Vuc29yUHJvcGVydGllcxI0CgtzdGF0ZV92YWx1ZRgBIAEoCEIaiLUYRZK1GApTdGF0ZVZhbHVlsLUYAMi1GAVIAIgBAToFmrUYARVCDgoMX3N0YXRlX3ZhbHVlIvkGChhXaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXMSMQoNY292ZXJpbmdfdHlwZRgBIAEoDUIViLUYggKStRgEVHlwZbC1GADItRgFSACIAQESYwojY3VycmVudF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHMYAiABKA1CMYi1GIICkrUYIEN1cnJlbnRQb3NpdGlvbkxpZnRQZXJjZW50MTAwdGhzsLUYDsi1GAVIAYgBARJjCiNjdXJyZW50X3Bvc2l0aW9uX3RpbHRfcGVyY2VudDEwMHRocxgDIAEoDUIxiLUYggKStRggQ3VycmVudFBvc2l0aW9uVGlsdFBlcmNlbnQxMDB0aHOwtRgPyLUYBUgCiAEBEmEKInRhcmdldF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHMYBCABKA1CMIi1GIICkrUYH1RhcmdldFBvc2l0aW9uTGlmdFBlcmNlbnQxMDB0aHOwtRgLyLUYBUgDiAEBEmEKInRhcmdldF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHMYBSABKA1CMIi1GIICkrUYH1RhcmdldFBvc2l0aW9uVGlsdFBlcmNlbnQxMDB0aHOwtRgMyLUYBUgEiAEBEkMKEm9wZXJhdGlvbmFsX3N0YXR1cxgGIAEoDUIiiLUYggKStRgRT3BlcmF0aW9uYWxTdGF0dXOwtRgKyLUYBUgFiAEBEj4KEGVuZF9wcm9kdWN0X3R5cGUYByABKA1CH4i1GIICkrUYDkVuZFByb2R1Y3RUeXBlsLUYDci1GAVIBogBARIoCgRtb2RlGAggASgNQhWItRiCApK1GARNb2RlsLUYF8i1GAdIB4gBAToGmrUYAoIEQhAKDl9jb3ZlcmluZ190eXBlQiYKJF9jdXJyZW50X3Bvc2l0aW9uX2xpZnRfcGVyY2VudDEwMHRoc0ImCiRfY3VycmVudF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCFQoTX29wZXJhdGlvbmFsX3N0YXR1c0ITChFfZW5kX3Byb2R1Y3RfdHlwZUIHCgVfbW9kZSKKAwoSRG9vckxvY2tQcm9wZXJ0aWVzEjMKCmxvY2tfc3RhdGUYASABKA1CGoi1GIECkrUYCUxvY2tTdGF0ZbC1GADItRgFSACIAQESMQoJbG9ja190eXBlGAIgASgNQhmItRiBApK1GAhMb2NrVHlwZbC1GAHItRgFSAGIAQESPwoQYWN0dWF0b3JfZW5hYmxlZBgDIAEoCEIgiLUYgQKStRgPQWN0dWF0b3JFbmFibGVksLUYAsi1GAVIAogBARIzCgpkb29yX3N0YXRlGAQgASgNQhqItRiBApK1GAlEb29yU3RhdGWwtRgDyLUYBUgDiAEBEjsKDm9wZXJhdGluZ19tb2RlGAUgASgNQh6ItRiBApK1GA1PcGVyYXRpbmdNb2RlsLUYJci1GAdIBIgBAToFmrUYAQpCDQoLX2xvY2tfc3RhdGVCDAoKX2xvY2tfdHlwZUITChFfYWN0dWF0b3JfZW5hYmxlZEINCgtfZG9vcl9zdGF0ZUIRCg9fb3BlcmF0aW5nX21vZGUikgMKFE9uT2ZmTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESRwoUZ2xvYmFsX3NjZW5lX2NvbnRyb2wYAiABKAhCJIi1GAaStRgSR2xvYmFsU2NlbmVDb250cm9ssLUYgIAByLUYBUgBiAEBEi4KB29uX3RpbWUYAyABKA1CGIi1GAaStRgGT25UaW1lsLUYgYAByLUYB0gCiAEBEjkKDW9mZl93YWl0X3RpbWUYBCABKA1CHYi1GAaStRgLT2ZmV2FpdFRpbWWwtRiCgAHItRgHSAOIAQESPAoPc3RhcnRfdXBfb25fb2ZmGAUgASgNQh6ItRgGkrUYDFN0YXJ0VXBPbk9mZrC1GIOAAci1GAdIBIgBAToGmrUYAoACQgkKB19vbl9vZmZCFwoVX2dsb2JhbF9zY2VuZV9jb250cm9sQgoKCF9vbl90aW1lQhAKDl9vZmZfd2FpdF90aW1lQhIKEF9zdGFydF91cF9vbl9vZmYilwQKF0RpbW1hYmxlTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESOAoNY3VycmVudF9sZXZlbBgCIAEoDUIciLUYCJK1GAxDdXJyZW50TGV2ZWywtRgAyLUYBUgBiAEBEjAKCW1pbl9sZXZlbBgDIAEoDUIYiLUYCJK1GAhNaW5MZXZlbLC1GALItRgFSAKIAQESMAoJbWF4X2xldmVsGAQgASgNQhiItRgIkrUYCE1heExldmVssLUYA8i1GAVIA4gBARIuCghvbl9sZXZlbBgFIAEoDUIXiLUYCJK1GAdPbkxldmVssLUYEci1GAdIBIgBARJKChZzdGFydF91cF9jdXJyZW50X2xldmVsGAYgASgNQiWItRgIkrUYE1N0YXJ0VXBDdXJyZW50TGV2ZWywtRiAgAHItRgHSAWIAQESOgoOcmVtYWluaW5nX3RpbWUYByABKA1CHYi1GAiStRgNUmVtYWluaW5nVGltZbC1GAHItRgBSAaIAQE6Bpq1GAKBAkIJCgdfb25fb2ZmQhAKDl9jdXJyZW50X2xldmVsQgwKCl9taW5fbGV2ZWxCDAoKX21heF9sZXZlbEILCglfb25fbGV2ZWxCGQoXX3N0YXJ0X3VwX2N1cnJlbnRfbGV2ZWxCEQoPX3JlbWFpbmluZ190aW1lIuEFCh9Db2xvclRlbXBlcmF0dXJlTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESOAoNY3VycmVudF9sZXZlbBgCIAEoDUIciLUYCJK1GAxDdXJyZW50TGV2ZWywtRgAyLUYBUgBiAEBEk4KGGNvbG9yX3RlbXBlcmF0dXJlX21pcmVkcxgDIAEoDUIniLUYgAaStRgWQ29sb3JUZW1wZXJhdHVyZU1pcmVkc7C1GAfItRgFSAKIAQESWgoeY29sb3JfdGVtcF9waHlzaWNhbF9taW5fbWlyZWRzGAQgASgNQi2ItRiABpK1GBpDb2xvclRlbXBQaHlzaWNhbE1pbk1pcmVkc7C1GIuAAci1GAVIA4gBARJaCh5jb2xvcl90ZW1wX3BoeXNpY2FsX21heF9taXJlZHMYBSABKA1CLYi1GIAGkrUYGkNvbG9yVGVtcFBoeXNpY2FsTWF4TWlyZWRzsLUYjIAByLUYBUgEiAEBEl8KIHN0YXJ0dXBfY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzGAYgASgNQjCItRiABpK1GB1TdGFydFVwQ29sb3JUZW1wZXJhdHVyZU1pcmVkc7C1GJCAAci1GAdIBYgBARIzCgpjb2xvcl9tb2RlGAcgASgNQhqItRiABpK1GAlDb2xvck1vZGWwtRgIyLUYBUgGiAEBOgaatRgCjAJCCQoHX29uX29mZkIQCg5fY3VycmVudF9sZXZlbEIbChlfY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzQiEKH19jb2xvcl90ZW1wX3BoeXNpY2FsX21pbl9taXJlZHNCIQofX2NvbG9yX3RlbXBfcGh5c2ljYWxfbWF4X21pcmVkc0IjCiFfc3RhcnR1cF9jb2xvcl90ZW1wZXJhdHVyZV9taXJlZHNCDQoLX2NvbG9yX21vZGUi+AIKFkVuZXJneVNlbnNvclByb3BlcnRpZXMSNwoMYWN0aXZlX3Bvd2VyGAUgASgSQhyItRiQAZK1GAtBY3RpdmVQb3dlcrC1GAjItRgFSACIAQESLgoHdm9sdGFnZRgGIAEoEkIYiLUYkAGStRgHVm9sdGFnZbC1GATItRgFSAGIAQESOwoOYWN0aXZlX2N1cnJlbnQYByABKBJCHoi1GJABkrUYDUFjdGl2ZUN1cnJlbnSwtRgFyLUYBUgCiAEBEjIKCWZyZXF1ZW5jeRgIIAEoEkIaiLUYkAGStRgJRnJlcXVlbmN5sLUYDsi1GAVIA4gBAToGmrUYApAKQg8KDV9hY3RpdmVfcG93ZXJCCgoIX3ZvbHRhZ2VCEQoPX2FjdGl2ZV9jdXJyZW50QgwKCl9mcmVxdWVuY3lKBAgBEAJKBAgCEANKBAgDEARKBAgEEAVSC3Jtc192b2x0YWdlUgtybXNfY3VycmVudFIMYWNfZnJlcXVlbmN5IuoCChhQcmVzc3VyZVNlbnNvclByb3BlcnRpZXMSOwoObWVhc3VyZWRfdmFsdWUYASABKBFCHoi1GIMIkrUYDU1lYXN1cmVkVmFsdWWwtRgAyLUYBUgAiAEBEkIKEm1pbl9tZWFzdXJlZF92YWx1ZRgCIAEoEUIhiLUYgwiStRgQTWluTWVhc3VyZWRWYWx1ZbC1GAHItRgFSAGIAQESQgoSbWF4X21lYXN1cmVkX3ZhbHVlGAMgASgRQiGItRiDCJK1GBBNYXhNZWFzdXJlZFZhbHVlsLUYAsi1GAVIAogBARIyCgl0b2xlcmFuY2UYBCABKA1CGoi1GIMIkrUYCVRvbGVyYW5jZbC1GAPItRgFSAOIAQE6Bpq1GAKFBkIRCg9fbWVhc3VyZWRfdmFsdWVCFQoTX21pbl9tZWFzdXJlZF92YWx1ZUIVChNfbWF4X21lYXN1cmVkX3ZhbHVlQgwKCl90b2xlcmFuY2UiuQMKFVBvd2VyU291cmNlUHJvcGVydGllcxJHChViYXRfcGVyY2VudF9yZW1haW5pbmcYASABKA1CI4i1GC+StRgTQmF0UGVyY2VudFJlbWFpbmluZ7C1GAzItRgFSACIAQESPQoQYmF0X2NoYXJnZV9sZXZlbBgCIAEoDUIeiLUYL5K1GA5CYXRDaGFyZ2VMZXZlbLC1GA7ItRgFSAGIAQESSQoWYmF0X3JlcGxhY2VtZW50X25lZWRlZBgDIAEoCEIkiLUYL5K1GBRCYXRSZXBsYWNlbWVudE5lZWRlZLC1GA/ItRgFSAKIAQESNAoLYmF0X3ZvbHRhZ2UYBCABKA1CGoi1GC+StRgKQmF0Vm9sdGFnZbC1GAvItRgFSAOIAQESKwoGc3RhdHVzGAUgASgNQhaItRgvkrUYBlN0YXR1c7C1GADItRgFSASIAQE6BZq1GAERQhgKFl9iYXRfcGVyY2VudF9yZW1haW5pbmdCEwoRX2JhdF9jaGFyZ2VfbGV2ZWxCGQoXX2JhdF9yZXBsYWNlbWVudF9uZWVkZWRCDgoMX2JhdF92b2x0YWdlQgkKB19zdGF0dXNCAkgBYgZwcm90bzM", [file_kusinta_iot_device_v1_matter_options]);
12
+ fileDesc("CiZrdXNpbnRhL2lvdC9kZXZpY2UvdjEvcHJvcGVydGllcy5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIv8IChRUaGVybW9zdGF0UHJvcGVydGllcxJBChFsb2NhbF90ZW1wZXJhdHVyZRgBIAEoEUIhiLUYgQSStRgQTG9jYWxUZW1wZXJhdHVyZbC1GADItRgFSACIAQESUAoZb2NjdXBpZWRfaGVhdGluZ19zZXRwb2ludBgCIAEoEUIoiLUYgQSStRgXT2NjdXBpZWRIZWF0aW5nU2V0cG9pbnSwtRgSyLUYB0gBiAEBElAKGW9jY3VwaWVkX2Nvb2xpbmdfc2V0cG9pbnQYAyABKBFCKIi1GIEEkrUYF09jY3VwaWVkQ29vbGluZ1NldHBvaW50sLUYEci1GAdIAogBARJLChdtaW5faGVhdF9zZXRwb2ludF9saW1pdBgEIAEoEUIliLUYgQSStRgUTWluSGVhdFNldHBvaW50TGltaXSwtRgVyLUYB0gDiAEBEksKF21heF9oZWF0X3NldHBvaW50X2xpbWl0GAUgASgRQiWItRiBBJK1GBRNYXhIZWF0U2V0cG9pbnRMaW1pdLC1GBbItRgHSASIAQESSwoXbWluX2Nvb2xfc2V0cG9pbnRfbGltaXQYBiABKBFCJYi1GIEEkrUYFE1pbkNvb2xTZXRwb2ludExpbWl0sLUYF8i1GAdIBYgBARJLChdtYXhfY29vbF9zZXRwb2ludF9saW1pdBgHIAEoEUIliLUYgQSStRgUTWF4Q29vbFNldHBvaW50TGltaXSwtRgYyLUYB0gGiAEBElcKHWNvbnRyb2xfc2VxdWVuY2Vfb2Zfb3BlcmF0aW9uGAggASgNQiuItRiBBJK1GBpDb250cm9sU2VxdWVuY2VPZk9wZXJhdGlvbrC1GBvItRgHSAeIAQESNQoLc3lzdGVtX21vZGUYCSABKA1CG4i1GIEEkrUYClN5c3RlbU1vZGWwtRgcyLUYB0gIiAEBEkwKF3RoZXJtb3N0YXRfcnVubmluZ19tb2RlGAogASgNQiaItRiBBJK1GBVUaGVybW9zdGF0UnVubmluZ01vZGWwtRgeyLUYBUgJiAEBEkAKEXBpX2hlYXRpbmdfZGVtYW5kGAsgASgNQiCItRiBBJK1GA9QSUhlYXRpbmdEZW1hbmSwtRgIyLUYBUgKiAEBOgaatRgCgQZCFAoSX2xvY2FsX3RlbXBlcmF0dXJlQhwKGl9vY2N1cGllZF9oZWF0aW5nX3NldHBvaW50QhwKGl9vY2N1cGllZF9jb29saW5nX3NldHBvaW50QhoKGF9taW5faGVhdF9zZXRwb2ludF9saW1pdEIaChhfbWF4X2hlYXRfc2V0cG9pbnRfbGltaXRCGgoYX21pbl9jb29sX3NldHBvaW50X2xpbWl0QhoKGF9tYXhfY29vbF9zZXRwb2ludF9saW1pdEIgCh5fY29udHJvbF9zZXF1ZW5jZV9vZl9vcGVyYXRpb25CDgoMX3N5c3RlbV9tb2RlQhoKGF90aGVybW9zdGF0X3J1bm5pbmdfbW9kZUIUChJfcGlfaGVhdGluZ19kZW1hbmQi7QIKG1RlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllcxI7Cg5tZWFzdXJlZF92YWx1ZRgBIAEoEUIeiLUYggiStRgNTWVhc3VyZWRWYWx1ZbC1GADItRgFSACIAQESQgoSbWluX21lYXN1cmVkX3ZhbHVlGAIgASgRQiGItRiCCJK1GBBNaW5NZWFzdXJlZFZhbHVlsLUYAci1GAVIAYgBARJCChJtYXhfbWVhc3VyZWRfdmFsdWUYAyABKBFCIYi1GIIIkrUYEE1heE1lYXN1cmVkVmFsdWWwtRgCyLUYBUgCiAEBEjIKCXRvbGVyYW5jZRgEIAEoDUIaiLUYggiStRgJVG9sZXJhbmNlsLUYA8i1GAVIA4gBAToGmrUYAoIGQhEKD19tZWFzdXJlZF92YWx1ZUIVChNfbWluX21lYXN1cmVkX3ZhbHVlQhUKE19tYXhfbWVhc3VyZWRfdmFsdWVCDAoKX3RvbGVyYW5jZSLqAgoYSHVtaWRpdHlTZW5zb3JQcm9wZXJ0aWVzEjsKDm1lYXN1cmVkX3ZhbHVlGAEgASgNQh6ItRiFCJK1GA1NZWFzdXJlZFZhbHVlsLUYAMi1GAVIAIgBARJCChJtaW5fbWVhc3VyZWRfdmFsdWUYAiABKA1CIYi1GIUIkrUYEE1pbk1lYXN1cmVkVmFsdWWwtRgByLUYBUgBiAEBEkIKEm1heF9tZWFzdXJlZF92YWx1ZRgDIAEoDUIhiLUYhQiStRgQTWF4TWVhc3VyZWRWYWx1ZbC1GALItRgFSAKIAQESMgoJdG9sZXJhbmNlGAQgASgNQhqItRiFCJK1GAlUb2xlcmFuY2WwtRgDyLUYBUgDiAEBOgaatRgChwZCEQoPX21lYXN1cmVkX3ZhbHVlQhUKE19taW5fbWVhc3VyZWRfdmFsdWVCFQoTX21heF9tZWFzdXJlZF92YWx1ZUIMCgpfdG9sZXJhbmNlIvcEChlPY2N1cGFuY3lTZW5zb3JQcm9wZXJ0aWVzEjIKCW9jY3VwYW5jeRgBIAEoDUIaiLUYhgiStRgJT2NjdXBhbmN5sLUYAMi1GAVIAIgBARJIChVvY2N1cGFuY3lfc2Vuc29yX3R5cGUYAiABKA1CJIi1GIYIkrUYE09jY3VwYW5jeVNlbnNvclR5cGWwtRgByLUYBUgBiAEBElUKHG9jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXAYAyABKA1CKoi1GIYIkrUYGU9jY3VwYW5jeVNlbnNvclR5cGVCaXRtYXCwtRgCyLUYBUgCiAEBElwKIHBpcl9vY2N1cGllZF90b191bm9jY3VwaWVkX2RlbGF5GAQgASgNQi2ItRiGCJK1GBxQSVJPY2N1cGllZFRvVW5vY2N1cGllZERlbGF5sLUYEMi1GAdIA4gBARJcCiBwaXJfdW5vY2N1cGllZF90b19vY2N1cGllZF9kZWxheRgFIAEoDUItiLUYhgiStRgcUElSVW5vY2N1cGllZFRvT2NjdXBpZWREZWxhebC1GBHItRgHSASIAQE6Bpq1GAKHAkIMCgpfb2NjdXBhbmN5QhgKFl9vY2N1cGFuY3lfc2Vuc29yX3R5cGVCHwodX29jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXBCIwohX3Bpcl9vY2N1cGllZF90b191bm9jY3VwaWVkX2RlbGF5QiMKIV9waXJfdW5vY2N1cGllZF90b19vY2N1cGllZF9kZWxheVIWcGlyX29jY190b191bm9jY19kZWxheVIWcGlyX3Vub2NjX3RvX29jY19kZWxheSJmChdDb250YWN0U2Vuc29yUHJvcGVydGllcxI0CgtzdGF0ZV92YWx1ZRgBIAEoCEIaiLUYRZK1GApTdGF0ZVZhbHVlsLUYAMi1GAVIAIgBAToFmrUYARVCDgoMX3N0YXRlX3ZhbHVlIvkGChhXaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXMSMQoNY292ZXJpbmdfdHlwZRgBIAEoDUIViLUYggKStRgEVHlwZbC1GADItRgFSACIAQESYwojY3VycmVudF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHMYAiABKA1CMYi1GIICkrUYIEN1cnJlbnRQb3NpdGlvbkxpZnRQZXJjZW50MTAwdGhzsLUYDsi1GAVIAYgBARJjCiNjdXJyZW50X3Bvc2l0aW9uX3RpbHRfcGVyY2VudDEwMHRocxgDIAEoDUIxiLUYggKStRggQ3VycmVudFBvc2l0aW9uVGlsdFBlcmNlbnQxMDB0aHOwtRgPyLUYBUgCiAEBEmEKInRhcmdldF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHMYBCABKA1CMIi1GIICkrUYH1RhcmdldFBvc2l0aW9uTGlmdFBlcmNlbnQxMDB0aHOwtRgLyLUYBUgDiAEBEmEKInRhcmdldF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHMYBSABKA1CMIi1GIICkrUYH1RhcmdldFBvc2l0aW9uVGlsdFBlcmNlbnQxMDB0aHOwtRgMyLUYBUgEiAEBEkMKEm9wZXJhdGlvbmFsX3N0YXR1cxgGIAEoDUIiiLUYggKStRgRT3BlcmF0aW9uYWxTdGF0dXOwtRgKyLUYBUgFiAEBEj4KEGVuZF9wcm9kdWN0X3R5cGUYByABKA1CH4i1GIICkrUYDkVuZFByb2R1Y3RUeXBlsLUYDci1GAVIBogBARIoCgRtb2RlGAggASgNQhWItRiCApK1GARNb2RlsLUYF8i1GAdIB4gBAToGmrUYAoIEQhAKDl9jb3ZlcmluZ190eXBlQiYKJF9jdXJyZW50X3Bvc2l0aW9uX2xpZnRfcGVyY2VudDEwMHRoc0ImCiRfY3VycmVudF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCFQoTX29wZXJhdGlvbmFsX3N0YXR1c0ITChFfZW5kX3Byb2R1Y3RfdHlwZUIHCgVfbW9kZSKKAwoSRG9vckxvY2tQcm9wZXJ0aWVzEjMKCmxvY2tfc3RhdGUYASABKA1CGoi1GIECkrUYCUxvY2tTdGF0ZbC1GADItRgFSACIAQESMQoJbG9ja190eXBlGAIgASgNQhmItRiBApK1GAhMb2NrVHlwZbC1GAHItRgFSAGIAQESPwoQYWN0dWF0b3JfZW5hYmxlZBgDIAEoCEIgiLUYgQKStRgPQWN0dWF0b3JFbmFibGVksLUYAsi1GAVIAogBARIzCgpkb29yX3N0YXRlGAQgASgNQhqItRiBApK1GAlEb29yU3RhdGWwtRgDyLUYBUgDiAEBEjsKDm9wZXJhdGluZ19tb2RlGAUgASgNQh6ItRiBApK1GA1PcGVyYXRpbmdNb2RlsLUYJci1GAdIBIgBAToFmrUYAQpCDQoLX2xvY2tfc3RhdGVCDAoKX2xvY2tfdHlwZUITChFfYWN0dWF0b3JfZW5hYmxlZEINCgtfZG9vcl9zdGF0ZUIRCg9fb3BlcmF0aW5nX21vZGUikgMKFE9uT2ZmTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESRwoUZ2xvYmFsX3NjZW5lX2NvbnRyb2wYAiABKAhCJIi1GAaStRgSR2xvYmFsU2NlbmVDb250cm9ssLUYgIAByLUYBUgBiAEBEi4KB29uX3RpbWUYAyABKA1CGIi1GAaStRgGT25UaW1lsLUYgYAByLUYB0gCiAEBEjkKDW9mZl93YWl0X3RpbWUYBCABKA1CHYi1GAaStRgLT2ZmV2FpdFRpbWWwtRiCgAHItRgHSAOIAQESPAoPc3RhcnRfdXBfb25fb2ZmGAUgASgNQh6ItRgGkrUYDFN0YXJ0VXBPbk9mZrC1GIOAAci1GAdIBIgBAToGmrUYAoACQgkKB19vbl9vZmZCFwoVX2dsb2JhbF9zY2VuZV9jb250cm9sQgoKCF9vbl90aW1lQhAKDl9vZmZfd2FpdF90aW1lQhIKEF9zdGFydF91cF9vbl9vZmYilwQKF0RpbW1hYmxlTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESOAoNY3VycmVudF9sZXZlbBgCIAEoDUIciLUYCJK1GAxDdXJyZW50TGV2ZWywtRgAyLUYBUgBiAEBEjAKCW1pbl9sZXZlbBgDIAEoDUIYiLUYCJK1GAhNaW5MZXZlbLC1GALItRgFSAKIAQESMAoJbWF4X2xldmVsGAQgASgNQhiItRgIkrUYCE1heExldmVssLUYA8i1GAVIA4gBARIuCghvbl9sZXZlbBgFIAEoDUIXiLUYCJK1GAdPbkxldmVssLUYEci1GAdIBIgBARJKChZzdGFydF91cF9jdXJyZW50X2xldmVsGAYgASgNQiWItRgIkrUYE1N0YXJ0VXBDdXJyZW50TGV2ZWywtRiAgAHItRgHSAWIAQESOgoOcmVtYWluaW5nX3RpbWUYByABKA1CHYi1GAiStRgNUmVtYWluaW5nVGltZbC1GAHItRgBSAaIAQE6Bpq1GAKBAkIJCgdfb25fb2ZmQhAKDl9jdXJyZW50X2xldmVsQgwKCl9taW5fbGV2ZWxCDAoKX21heF9sZXZlbEILCglfb25fbGV2ZWxCGQoXX3N0YXJ0X3VwX2N1cnJlbnRfbGV2ZWxCEQoPX3JlbWFpbmluZ190aW1lIuEFCh9Db2xvclRlbXBlcmF0dXJlTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESOAoNY3VycmVudF9sZXZlbBgCIAEoDUIciLUYCJK1GAxDdXJyZW50TGV2ZWywtRgAyLUYBUgBiAEBEk4KGGNvbG9yX3RlbXBlcmF0dXJlX21pcmVkcxgDIAEoDUIniLUYgAaStRgWQ29sb3JUZW1wZXJhdHVyZU1pcmVkc7C1GAfItRgFSAKIAQESWgoeY29sb3JfdGVtcF9waHlzaWNhbF9taW5fbWlyZWRzGAQgASgNQi2ItRiABpK1GBpDb2xvclRlbXBQaHlzaWNhbE1pbk1pcmVkc7C1GIuAAci1GAVIA4gBARJaCh5jb2xvcl90ZW1wX3BoeXNpY2FsX21heF9taXJlZHMYBSABKA1CLYi1GIAGkrUYGkNvbG9yVGVtcFBoeXNpY2FsTWF4TWlyZWRzsLUYjIAByLUYBUgEiAEBEl8KIHN0YXJ0dXBfY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzGAYgASgNQjCItRiABpK1GB1TdGFydFVwQ29sb3JUZW1wZXJhdHVyZU1pcmVkc7C1GJCAAci1GAdIBYgBARIzCgpjb2xvcl9tb2RlGAcgASgNQhqItRiABpK1GAlDb2xvck1vZGWwtRgIyLUYBUgGiAEBOgaatRgCjAJCCQoHX29uX29mZkIQCg5fY3VycmVudF9sZXZlbEIbChlfY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzQiEKH19jb2xvcl90ZW1wX3BoeXNpY2FsX21pbl9taXJlZHNCIQofX2NvbG9yX3RlbXBfcGh5c2ljYWxfbWF4X21pcmVkc0IjCiFfc3RhcnR1cF9jb2xvcl90ZW1wZXJhdHVyZV9taXJlZHNCDQoLX2NvbG9yX21vZGUi3gQKFkVuZXJneVNlbnNvclByb3BlcnRpZXMSNwoMYWN0aXZlX3Bvd2VyGAUgASgSQhyItRiQAZK1GAtBY3RpdmVQb3dlcrC1GAjItRgFSACIAQESLgoHdm9sdGFnZRgGIAEoEkIYiLUYkAGStRgHVm9sdGFnZbC1GATItRgFSAGIAQESOwoOYWN0aXZlX2N1cnJlbnQYByABKBJCHoi1GJABkrUYDUFjdGl2ZUN1cnJlbnSwtRgFyLUYBUgCiAEBEjIKCWZyZXF1ZW5jeRgIIAEoEkIaiLUYkAGStRgJRnJlcXVlbmN5sLUYDsi1GAVIA4gBARJSChpjdW11bGF0aXZlX2VuZXJneV9pbXBvcnRlZBgJIAEoBEIpiLUYkQGStRgYQ3VtdWxhdGl2ZUVuZXJneUltcG9ydGVksLUYAci1GAVIBIgBARJSChpjdW11bGF0aXZlX2VuZXJneV9leHBvcnRlZBgKIAEoBEIpiLUYkQGStRgYQ3VtdWxhdGl2ZUVuZXJneUV4cG9ydGVksLUYAsi1GAVIBYgBAToGmrUYApAKQg8KDV9hY3RpdmVfcG93ZXJCCgoIX3ZvbHRhZ2VCEQoPX2FjdGl2ZV9jdXJyZW50QgwKCl9mcmVxdWVuY3lCHQobX2N1bXVsYXRpdmVfZW5lcmd5X2ltcG9ydGVkQh0KG19jdW11bGF0aXZlX2VuZXJneV9leHBvcnRlZEoECAEQAkoECAIQA0oECAMQBEoECAQQBVILcm1zX3ZvbHRhZ2VSC3Jtc19jdXJyZW50UgxhY19mcmVxdWVuY3ki6gIKGFByZXNzdXJlU2Vuc29yUHJvcGVydGllcxI7Cg5tZWFzdXJlZF92YWx1ZRgBIAEoEUIeiLUYgwiStRgNTWVhc3VyZWRWYWx1ZbC1GADItRgFSACIAQESQgoSbWluX21lYXN1cmVkX3ZhbHVlGAIgASgRQiGItRiDCJK1GBBNaW5NZWFzdXJlZFZhbHVlsLUYAci1GAVIAYgBARJCChJtYXhfbWVhc3VyZWRfdmFsdWUYAyABKBFCIYi1GIMIkrUYEE1heE1lYXN1cmVkVmFsdWWwtRgCyLUYBUgCiAEBEjIKCXRvbGVyYW5jZRgEIAEoDUIaiLUYgwiStRgJVG9sZXJhbmNlsLUYA8i1GAVIA4gBAToGmrUYAoUGQhEKD19tZWFzdXJlZF92YWx1ZUIVChNfbWluX21lYXN1cmVkX3ZhbHVlQhUKE19tYXhfbWVhc3VyZWRfdmFsdWVCDAoKX3RvbGVyYW5jZSK5AwoVUG93ZXJTb3VyY2VQcm9wZXJ0aWVzEkcKFWJhdF9wZXJjZW50X3JlbWFpbmluZxgBIAEoDUIjiLUYL5K1GBNCYXRQZXJjZW50UmVtYWluaW5nsLUYDMi1GAVIAIgBARI9ChBiYXRfY2hhcmdlX2xldmVsGAIgASgNQh6ItRgvkrUYDkJhdENoYXJnZUxldmVssLUYDsi1GAVIAYgBARJJChZiYXRfcmVwbGFjZW1lbnRfbmVlZGVkGAMgASgIQiSItRgvkrUYFEJhdFJlcGxhY2VtZW50TmVlZGVksLUYD8i1GAVIAogBARI0CgtiYXRfdm9sdGFnZRgEIAEoDUIaiLUYL5K1GApCYXRWb2x0YWdlsLUYC8i1GAVIA4gBARIrCgZzdGF0dXMYBSABKA1CFoi1GC+StRgGU3RhdHVzsLUYAMi1GAVIBIgBAToFmrUYARFCGAoWX2JhdF9wZXJjZW50X3JlbWFpbmluZ0ITChFfYmF0X2NoYXJnZV9sZXZlbEIZChdfYmF0X3JlcGxhY2VtZW50X25lZWRlZEIOCgxfYmF0X3ZvbHRhZ2VCCQoHX3N0YXR1c0ICSAFiBnByb3RvMw", [file_kusinta_iot_device_v1_matter_options]);
13
13
 
14
14
  /**
15
15
  * Describes the message kusinta.iot.device.v1.ThermostatProperties.
@@ -5,6 +5,7 @@
5
5
  import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { DeviceId } from "../../identity/v1/identity_pb.js";
8
+ import type { NullValue } from "./cluster_state_pb.js";
8
9
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
9
10
 
10
11
  /**
@@ -26,8 +27,9 @@ export declare const file_kusinta_iot_device_v1_property_update: GenFile;
26
27
  * 2. Pick the message. Two branches, chosen by whether vendor_extension is set:
27
28
  * - absent (Matter): the Endpoint.matter_properties case whose message type declares
28
29
  * (matter_device_type) == Endpoint.matter_device_type_id.
29
- * - present (vendor): the Endpoint.vendor_properties case whose message type declares
30
- * (vendor_extension) == the update's vendor_extension.
30
+ * - present (vendor): the Endpoint field whose message type declares
31
+ * (vendor_extension) == the update's vendor_extension — a vendor_properties case,
32
+ * or radio_link ("kusinta.radio"), which sits outside that oneof.
31
33
  * 3. Pick the field:
32
34
  * - Matter branch: the one field whose (matter_cluster_id) equals cluster_id AND
33
35
  * whose (matter_attribute_id) equals attribute_id.
@@ -104,6 +106,12 @@ export declare type PropertyUpdate = Message<"kusinta.iot.device.v1.PropertyUpda
104
106
  attributeName?: string | undefined;
105
107
 
106
108
  /**
109
+ * A value wider than 32 bits travels in int64_value or uint64_value: a cumulative energy
110
+ * counter in milliwatt-hours passes uint32 at about 4,295 kWh. A producer may send a value
111
+ * that fits in either width, and a consumer reads both into the same typed field.
112
+ * null_value is a reported Matter null: it leaves the typed field unset, "not reported",
113
+ * rather than keeping the last value.
114
+ *
107
115
  * @generated from oneof kusinta.iot.device.v1.PropertyUpdate.value
108
116
  */
109
117
  value: {
@@ -142,6 +150,24 @@ export declare type PropertyUpdate = Message<"kusinta.iot.device.v1.PropertyUpda
142
150
  */
143
151
  value: Uint8Array;
144
152
  case: "bytesValue";
153
+ } | {
154
+ /**
155
+ * @generated from field: sint64 int64_value = 16;
156
+ */
157
+ value: bigint;
158
+ case: "int64Value";
159
+ } | {
160
+ /**
161
+ * @generated from field: uint64 uint64_value = 17;
162
+ */
163
+ value: bigint;
164
+ case: "uint64Value";
165
+ } | {
166
+ /**
167
+ * @generated from field: kusinta.iot.device.v1.NullValue null_value = 18;
168
+ */
169
+ value: NullValue;
170
+ case: "nullValue";
145
171
  } | { case: undefined; value?: undefined };
146
172
 
147
173
  /**
@@ -4,13 +4,14 @@
4
4
 
5
5
  import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
6
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
7
+ import { file_kusinta_iot_device_v1_cluster_state } from "./cluster_state_pb.js";
7
8
  import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
8
9
 
9
10
  /**
10
11
  * Describes the file kusinta/iot/device/v1/property_update.proto.
11
12
  */
12
13
  export const file_kusinta_iot_device_v1_property_update = /*@__PURE__*/
13
- fileDesc("CitrdXNpbnRhL2lvdC9kZXZpY2UvdjEvcHJvcGVydHlfdXBkYXRlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEiuQQKDlByb3BlcnR5VXBkYXRlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEhsKDmF0dHJpYnV0ZV9uYW1lGAIgASgJSAGIAQESEwoJaW50X3ZhbHVlGAMgASgRSAASFAoKdWludF92YWx1ZRgEIAEoDUgAEhQKCmJvb2xfdmFsdWUYBSABKAhIABIVCgtmbG9hdF92YWx1ZRgGIAEoAkgAEhYKDHN0cmluZ192YWx1ZRgHIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAggASgMSAASLQoJdGltZXN0YW1wGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI6Cgpwcm92ZW5hbmNlGAsgASgOMiYua3VzaW50YS5pb3QuZGV2aWNlLnYxLlZhbHVlUHJvdmVuYW5jZRIYCgtlbmRwb2ludF9pZBgMIAEoDUgCiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YDSABKAlIA4gBARIXCgpjbHVzdGVyX2lkGA4gASgNSASIAQESGQoMYXR0cmlidXRlX2lkGA8gASgNSAWIAQFCBwoFdmFsdWVCEQoPX2F0dHJpYnV0ZV9uYW1lQg4KDF9lbmRwb2ludF9pZEITChFfdmVuZG9yX2V4dGVuc2lvbkINCgtfY2x1c3Rlcl9pZEIPCg1fYXR0cmlidXRlX2lkSgQIChALUg5jbHVzdGVyX2lkX2hleCKCAQoTUHJvcGVydHlVcGRhdGVCYXRjaBI2Cgd1cGRhdGVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLlByb3BlcnR5VXBkYXRlEjMKD2JhdGNoX3RpbWVzdGFtcBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqlAEKD1ZhbHVlUHJvdmVuYW5jZRIgChxWQUxVRV9QUk9WRU5BTkNFX1VOU1BFQ0lGSUVEEAASHgoaVkFMVUVfUFJPVkVOQU5DRV9DT05GSVJNRUQQARIfChtWQUxVRV9QUk9WRU5BTkNFX09QVElNSVNUSUMQAhIeChpWQUxVRV9QUk9WRU5BTkNFX0NPUlJFQ1RFRBADQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_identity_v1_identity]);
14
+ fileDesc("CitrdXNpbnRhL2lvdC9kZXZpY2UvdjEvcHJvcGVydHlfdXBkYXRlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEioAUKDlByb3BlcnR5VXBkYXRlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEhsKDmF0dHJpYnV0ZV9uYW1lGAIgASgJSAGIAQESEwoJaW50X3ZhbHVlGAMgASgRSAASFAoKdWludF92YWx1ZRgEIAEoDUgAEhQKCmJvb2xfdmFsdWUYBSABKAhIABIVCgtmbG9hdF92YWx1ZRgGIAEoAkgAEhYKDHN0cmluZ192YWx1ZRgHIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAggASgMSAASFQoLaW50NjRfdmFsdWUYECABKBJIABIWCgx1aW50NjRfdmFsdWUYESABKARIABI2CgpudWxsX3ZhbHVlGBIgASgLMiAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk51bGxWYWx1ZUgAEi0KCXRpbWVzdGFtcBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASOgoKcHJvdmVuYW5jZRgLIAEoDjImLmt1c2ludGEuaW90LmRldmljZS52MS5WYWx1ZVByb3ZlbmFuY2USGAoLZW5kcG9pbnRfaWQYDCABKA1IAogBARIdChB2ZW5kb3JfZXh0ZW5zaW9uGA0gASgJSAOIAQESFwoKY2x1c3Rlcl9pZBgOIAEoDUgEiAEBEhkKDGF0dHJpYnV0ZV9pZBgPIAEoDUgFiAEBQgcKBXZhbHVlQhEKD19hdHRyaWJ1dGVfbmFtZUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb25CDQoLX2NsdXN0ZXJfaWRCDwoNX2F0dHJpYnV0ZV9pZEoECAoQC1IOY2x1c3Rlcl9pZF9oZXgiggEKE1Byb3BlcnR5VXBkYXRlQmF0Y2gSNgoHdXBkYXRlcxgBIAMoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5Qcm9wZXJ0eVVwZGF0ZRIzCg9iYXRjaF90aW1lc3RhbXAYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKpQBCg9WYWx1ZVByb3ZlbmFuY2USIAocVkFMVUVfUFJPVkVOQU5DRV9VTlNQRUNJRklFRBAAEh4KGlZBTFVFX1BST1ZFTkFOQ0VfQ09ORklSTUVEEAESHwobVkFMVUVfUFJPVkVOQU5DRV9PUFRJTUlTVElDEAISHgoaVkFMVUVfUFJPVkVOQU5DRV9DT1JSRUNURUQQA0ICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_identity_v1_identity]);
14
15
 
15
16
  /**
16
17
  * Describes the message kusinta.iot.device.v1.PropertyUpdate.