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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kusinta/iot-schema",
3
- "version": "0.2.0-beta.2",
3
+ "version": "0.2.0-beta.4",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -27,7 +27,11 @@
27
27
  "./connector/service": "./src/kusinta/iot/connector/v1/connector_service_pb.js",
28
28
  "./webrtc": "./src/kusinta/iot/webrtc/v1/envelope_pb.js",
29
29
  "./webrtc/app-token": "./src/kusinta/iot/webrtc/v1/app_token_pb.js",
30
+ "./webrtc/command": "./src/kusinta/iot/webrtc/v1/command_pb.js",
31
+ "./webrtc/device-state": "./src/kusinta/iot/webrtc/v1/device_state_pb.js",
30
32
  "./webrtc/management": "./src/kusinta/iot/webrtc/v1/management_pb.js",
33
+ "./webrtc/permission-push": "./src/kusinta/iot/webrtc/v1/permission_push_pb.js",
34
+ "./webrtc/setpoint-mode": "./src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js",
31
35
  "./registration": "./src/kusinta/iot/registration/v1/registration_pb.js",
32
36
  "./registration/service": "./src/kusinta/iot/registration/v1/registration_service_pb.js",
33
37
  "./signaling": "./src/kusinta/iot/signaling/v1/signaling_pb.js",
@@ -8,9 +8,9 @@ import type { ConnectorId, DeviceId, GatewayId } from "../../identity/v1/identit
8
8
  import type { ConnectorTransport } from "../../common/v1/types_pb.js";
9
9
  import type { Device } from "../../device/v1/device_pb.js";
10
10
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
11
+ import type { AttributeWriteRequest, CommandError, DeviceCommand } from "../../webrtc/v1/command_pb.js";
11
12
  import type { PropertyUpdateBatch } from "../../device/v1/property_update_pb.js";
12
13
  import type { DeviceEventBatch } from "../../device/v1/device_event_pb.js";
13
- import type { AttributeWriteRequest, DeviceCommand } from "../../webrtc/v1/command_pb.js";
14
14
 
15
15
  /**
16
16
  * Describes the file kusinta/iot/connector/v1/connector.proto.
@@ -196,6 +196,15 @@ export declare type UnsubscribeDevice = Message<"kusinta.iot.connector.v1.Unsubs
196
196
  export declare const UnsubscribeDeviceSchema: GenMessage<UnsubscribeDevice>;
197
197
 
198
198
  /**
199
+ * Session-level error, gateway → connector. NOT how a command or a write fails: that is
200
+ * an ordinary ConnectorCommandResult with success = false and a typed CommandError, and
201
+ * one operation failing says nothing about the session, which continues.
202
+ *
203
+ * code stays a free-form string here, unlike webrtc.v1.GatewayError's closed
204
+ * GatewayErrorCode and unlike the CommandError below. A connector is versioned on its own
205
+ * schedule and one may be a third party's, so the set of things that can go wrong between
206
+ * a gateway and a connector is not closed the way the app leg's is.
207
+ *
199
208
  * @generated from message kusinta.iot.connector.v1.GatewayError
200
209
  */
201
210
  export declare type GatewayError = Message<"kusinta.iot.connector.v1.GatewayError"> & {
@@ -210,7 +219,7 @@ export declare type GatewayError = Message<"kusinta.iot.connector.v1.GatewayErro
210
219
  message: string;
211
220
 
212
221
  /**
213
- * non-empty if the error answers a command or a write
222
+ * non-empty if the error refers to a specific request
214
223
  *
215
224
  * @generated from field: string request_id = 3;
216
225
  */
@@ -245,14 +254,53 @@ export declare type ConnectorCommandResult = Message<"kusinta.iot.connector.v1.C
245
254
  success: boolean;
246
255
 
247
256
  /**
248
- * @generated from field: kusinta.iot.connector.v1.GatewayError error = 3;
257
+ * @generated from field: google.protobuf.Timestamp completed_at = 4;
249
258
  */
250
- error?: GatewayError | undefined;
259
+ completedAt?: Timestamp | undefined;
251
260
 
252
261
  /**
253
- * @generated from field: google.protobuf.Timestamp completed_at = 4;
262
+ * Why it failed, in the same closed vocabulary the app is eventually given. The gateway
263
+ * forwards this into webrtc.v1.CommandResult.error unchanged; it does not translate.
264
+ *
265
+ * Shared rather than mirrored on purpose. The free-form string this replaces left every
266
+ * connector to invent its own spellings ("TIMEOUT", "UNSUPPORTED_MODE") and the gateway
267
+ * to keep a mapping table that silently fell behind whenever a connector coined a new
268
+ * one — which is the drift a closed vocabulary exists to prevent.
269
+ *
270
+ * A connector produces the subset it can actually observe: REJECTED_BY_DEVICE,
271
+ * UNREACHABLE, TIMEOUT, INVALID_COMMAND, INTERNAL. NOT_ENTITLED and
272
+ * CONSTRAINT_VIOLATED are the gateway's, decided before a command is forwarded at all;
273
+ * a connector never sees the caller's permissions and must not claim to.
274
+ *
275
+ * Rollout note: a connector whose schema predates this sends nothing on field 5 and the
276
+ * gateway reads UNSPECIFIED. Set success = false with no code and the meaning is "it
277
+ * failed, reason unstated" — which is what the string codes amounted to anyway.
278
+ *
279
+ * @generated from field: kusinta.iot.webrtc.v1.CommandError error = 5;
254
280
  */
255
- completedAt?: Timestamp | undefined;
281
+ error?: CommandError | undefined;
282
+
283
+ /**
284
+ * When this connector's own optimistic window closes: by this time the value has either
285
+ * been confirmed by the device or restored, and either way the connector will have
286
+ * published a PropertyUpdate saying so.
287
+ *
288
+ * Set it when the connector applied the value optimistically and runs a rollback timer
289
+ * of its own — a downstream device with a known, device-specific timeout. The gateway
290
+ * carries it into webrtc.v1.CommandResult.settles_by instead of applying a fixed guess:
291
+ * the connector is the only party that knows the timer, and a gateway-side constant
292
+ * chasing it is the same hardcoded-window problem one level up.
293
+ *
294
+ * Absent means no claim — either the connector confirms synchronously, or it cannot
295
+ * state a bound. Absent is NOT "settles immediately", and the gateway is free to fall
296
+ * back to a deadline of its own when nothing is stated here.
297
+ *
298
+ * This bounds the wait; it does not label the values that arrive. Which update was the
299
+ * optimistic one is device.v1.PropertyUpdate.provenance.
300
+ *
301
+ * @generated from field: optional google.protobuf.Timestamp settles_by = 6;
302
+ */
303
+ settlesBy?: Timestamp | undefined;
256
304
  };
257
305
 
258
306
  /**
@@ -15,7 +15,7 @@ import { file_kusinta_iot_webrtc_v1_command } from "../../webrtc/v1/command_pb.j
15
15
  * Describes the file kusinta/iot/connector/v1/connector.proto.
16
16
  */
17
17
  export const file_kusinta_iot_connector_v1_connector = /*@__PURE__*/
18
- fileDesc("CihrdXNpbnRhL2lvdC9jb25uZWN0b3IvdjEvY29ubmVjdG9yLnByb3RvEhhrdXNpbnRhLmlvdC5jb25uZWN0b3IudjEi5QEKDUNvbm5lY3RvckluZm8SOgoMY29ubmVjdG9yX2lkGAEgASgLMiQua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuQ29ubmVjdG9ySWQSFAoMZGlzcGxheV9uYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSPAoJdHJhbnNwb3J0GAQgASgOMikua3VzaW50YS5pb3QuY29tbW9uLnYxLkNvbm5lY3RvclRyYW5zcG9ydBIQCghlbmRwb2ludBgFIAEoCRIhChlzdXBwb3J0ZWRfZGV2aWNlX3R5cGVfaWRzGAYgAygNIoEBChJDb25uZWN0b3JIYW5kc2hha2USNQoEaW5mbxgBIAEoCzInLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5Db25uZWN0b3JJbmZvEjQKDWtub3duX2RldmljZXMYAiADKAsyHS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGV2aWNlImgKDEhhbmRzaGFrZUFjaxIQCghhY2NlcHRlZBgBIAEoCBIOCgZyZWFzb24YAiABKAkSNgoKZ2F0ZXdheV9pZBgDIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZCJVChJEZXZpY2VBbm5vdW5jZW1lbnQSLQoGZGV2aWNlGAIgASgLMh0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUoECAEQAlIKZGVzY3JpcHRvciJVCg1EZXZpY2VSZW1vdmFsEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEg4KBnJlYXNvbhgCIAEoCSILCglIZWFydEJlYXQiRwoPU3Vic2NyaWJlRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIkkKEVVuc3Vic2NyaWJlRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIkEKDEdhdGV3YXlFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKcmVxdWVzdF9pZBgDIAEoCSKmAQoWQ29ubmVjdG9yQ29tbWFuZFJlc3VsdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSNQoFZXJyb3IYAyABKAsyJi5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuR2F0ZXdheUVycm9yEjAKDGNvbXBsZXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiuwQKDlNlc3Npb25SZXF1ZXN0EhIKCm1lc3NhZ2VfaWQYASABKAkSKwoHc2VudF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASQQoJaGFuZHNoYWtlGAMgASgLMiwua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkNvbm5lY3RvckhhbmRzaGFrZUgAEkUKD3Byb3BlcnR5X3VwZGF0ZRgEIAEoCzIqLmt1c2ludGEuaW90LmRldmljZS52MS5Qcm9wZXJ0eVVwZGF0ZUJhdGNoSAASSAoQZGV2aWNlX2Fubm91bmNlZBgFIAEoCzIsLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5EZXZpY2VBbm5vdW5jZW1lbnRIABJBCg5kZXZpY2VfcmVtb3ZlZBgGIAEoCzInLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5EZXZpY2VSZW1vdmFsSAASSgoOY29tbWFuZF9yZXN1bHQYByABKAsyMC5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuQ29ubmVjdG9yQ29tbWFuZFJlc3VsdEgAEjgKCWhlYXJ0YmVhdBgIIAEoCzIjLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5IZWFydEJlYXRIABJACg1kZXZpY2VfZXZlbnRzGAkgASgLMicua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUV2ZW50QmF0Y2hIAEIJCgdwYXlsb2FkIvMDCg9TZXNzaW9uUmVzcG9uc2USEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI/Cg1oYW5kc2hha2VfYWNrGAMgASgLMiYua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkhhbmRzaGFrZUFja0gAEj4KCXN1YnNjcmliZRgFIAEoCzIpLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5TdWJzY3JpYmVEZXZpY2VIABJCCgt1bnN1YnNjcmliZRgGIAEoCzIrLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5VbnN1YnNjcmliZURldmljZUgAEjcKBWVycm9yGAcgASgLMiYua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkdhdGV3YXlFcnJvckgAEj8KD2V4ZWN1dGVfY29tbWFuZBgIIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VDb21tYW5kSAASTwoXZXhlY3V0ZV9hdHRyaWJ1dGVfd3JpdGUYCSABKAsyLC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXR0cmlidXRlV3JpdGVSZXF1ZXN0SABCCQoHcGF5bG9hZEoECAQQBUICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_device_v1_device, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_device_v1_property_update, file_kusinta_iot_webrtc_v1_command]);
18
+ fileDesc("CihrdXNpbnRhL2lvdC9jb25uZWN0b3IvdjEvY29ubmVjdG9yLnByb3RvEhhrdXNpbnRhLmlvdC5jb25uZWN0b3IudjEi5QEKDUNvbm5lY3RvckluZm8SOgoMY29ubmVjdG9yX2lkGAEgASgLMiQua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuQ29ubmVjdG9ySWQSFAoMZGlzcGxheV9uYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSPAoJdHJhbnNwb3J0GAQgASgOMikua3VzaW50YS5pb3QuY29tbW9uLnYxLkNvbm5lY3RvclRyYW5zcG9ydBIQCghlbmRwb2ludBgFIAEoCRIhChlzdXBwb3J0ZWRfZGV2aWNlX3R5cGVfaWRzGAYgAygNIoEBChJDb25uZWN0b3JIYW5kc2hha2USNQoEaW5mbxgBIAEoCzInLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5Db25uZWN0b3JJbmZvEjQKDWtub3duX2RldmljZXMYAiADKAsyHS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGV2aWNlImgKDEhhbmRzaGFrZUFjaxIQCghhY2NlcHRlZBgBIAEoCBIOCgZyZWFzb24YAiABKAkSNgoKZ2F0ZXdheV9pZBgDIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZCJVChJEZXZpY2VBbm5vdW5jZW1lbnQSLQoGZGV2aWNlGAIgASgLMh0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUoECAEQAlIKZGVzY3JpcHRvciJVCg1EZXZpY2VSZW1vdmFsEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEg4KBnJlYXNvbhgCIAEoCSILCglIZWFydEJlYXQiRwoPU3Vic2NyaWJlRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIkkKEVVuc3Vic2NyaWJlRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIkEKDEdhdGV3YXlFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKcmVxdWVzdF9pZBgDIAEoCSLtAQoWQ29ubmVjdG9yQ29tbWFuZFJlc3VsdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMAoMY29tcGxldGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIyCgVlcnJvchgFIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kRXJyb3ISMwoKc2V0dGxlc19ieRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfc2V0dGxlc19ieUoECAMQBCK7BAoOU2Vzc2lvblJlcXVlc3QSEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBJBCgloYW5kc2hha2UYAyABKAsyLC5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuQ29ubmVjdG9ySGFuZHNoYWtlSAASRQoPcHJvcGVydHlfdXBkYXRlGAQgASgLMioua3VzaW50YS5pb3QuZGV2aWNlLnYxLlByb3BlcnR5VXBkYXRlQmF0Y2hIABJIChBkZXZpY2VfYW5ub3VuY2VkGAUgASgLMiwua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkRldmljZUFubm91bmNlbWVudEgAEkEKDmRldmljZV9yZW1vdmVkGAYgASgLMicua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkRldmljZVJlbW92YWxIABJKCg5jb21tYW5kX3Jlc3VsdBgHIAEoCzIwLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5Db25uZWN0b3JDb21tYW5kUmVzdWx0SAASOAoJaGVhcnRiZWF0GAggASgLMiMua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkhlYXJ0QmVhdEgAEkAKDWRldmljZV9ldmVudHMYCSABKAsyJy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGV2aWNlRXZlbnRCYXRjaEgAQgkKB3BheWxvYWQi8wMKD1Nlc3Npb25SZXNwb25zZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEj8KDWhhbmRzaGFrZV9hY2sYAyABKAsyJi5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuSGFuZHNoYWtlQWNrSAASPgoJc3Vic2NyaWJlGAUgASgLMikua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLlN1YnNjcmliZURldmljZUgAEkIKC3Vuc3Vic2NyaWJlGAYgASgLMisua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLlVuc3Vic2NyaWJlRGV2aWNlSAASNwoFZXJyb3IYByABKAsyJi5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuR2F0ZXdheUVycm9ySAASPwoPZXhlY3V0ZV9jb21tYW5kGAggASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUNvbW1hbmRIABJPChdleGVjdXRlX2F0dHJpYnV0ZV93cml0ZRgJIAEoCzIsLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BdHRyaWJ1dGVXcml0ZVJlcXVlc3RIAEIJCgdwYXlsb2FkSgQIBBAFQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_device_v1_device, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_device_v1_property_update, file_kusinta_iot_webrtc_v1_command]);
19
19
 
20
20
  /**
21
21
  * Describes the message kusinta.iot.connector.v1.ConnectorInfo.
@@ -228,6 +228,31 @@ export declare type ClusterState = Message<"kusinta.iot.device.v1.ClusterState">
228
228
  * @generated from field: repeated uint32 accepted_command_ids = 5;
229
229
  */
230
230
  acceptedCommandIds: number[];
231
+
232
+ /**
233
+ * Matter's AttributeList (0xFFFB): which attributes this cluster instance actually
234
+ * implements HERE, on this endpoint of this device.
235
+ *
236
+ * It answers the question presence cannot. A typed field that is absent means "never
237
+ * reported" — and a device that will never report it, because it does not have the
238
+ * hardware, looks exactly the same. A wall thermostat drives no valve, so it has no
239
+ * PIHeatingDemand; a radiator valve has one it has not sent yet. Listed here with no
240
+ * value in the properties message = implemented, not yet reported. Absent from this
241
+ * list = the device does not have it.
242
+ *
243
+ * Distinct from feature_map, which is per-feature rather than per-attribute, and from
244
+ * (matter_attribute_capabilities), which says what the attribute IS — readable,
245
+ * writable, reportable — uniformly for every device, at compile time. Neither
246
+ * substitutes for the other: an app needs both to decide whether to draw a control,
247
+ * draw a value, or draw nothing.
248
+ *
249
+ * An empty list is "not stated", not "implements nothing". A producer that does not
250
+ * know its device's attribute list leaves it empty; one that does SHOULD fill it at
251
+ * announcement, where it costs nothing per update.
252
+ *
253
+ * @generated from field: repeated uint32 attribute_ids = 6;
254
+ */
255
+ attributeIds: number[];
231
256
  };
232
257
 
233
258
  /**
@@ -8,7 +8,7 @@ import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
8
8
  * Describes the file kusinta/iot/device/v1/cluster_state.proto.
9
9
  */
10
10
  export const file_kusinta_iot_device_v1_cluster_state = /*@__PURE__*/
11
- fileDesc("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUi2QEKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA1CEwoRX2NsdXN0ZXJfcmV2aXNpb25CDgoMX2ZlYXR1cmVfbWFwQgJIAWIGcHJvdG8z");
11
+ fileDesc("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUi8AEKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA0SFQoNYXR0cmlidXRlX2lkcxgGIAMoDUITChFfY2x1c3Rlcl9yZXZpc2lvbkIOCgxfZmVhdHVyZV9tYXBCAkgBYgZwcm90bzM");
12
12
 
13
13
  /**
14
14
  * Describes the message kusinta.iot.device.v1.NullValue.
@@ -5,7 +5,7 @@
5
5
  import type { 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
- import type { HmThermostatProps } from "../../vendor/homematic/v1/homematic_pb.js";
8
+ import type { HmMaintenanceProps, HmThermostatProps } from "../../vendor/homematic/v1/homematic_pb.js";
9
9
  import type { ClusterState } from "./cluster_state_pb.js";
10
10
  import type { DeviceDescriptor } from "./descriptor_pb.js";
11
11
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
@@ -173,6 +173,12 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
173
173
  */
174
174
  value: HmThermostatProps;
175
175
  case: "hmThermostat";
176
+ } | {
177
+ /**
178
+ * @generated from field: kusinta.iot.vendor.homematic.v1.HmMaintenanceProps hm_maintenance = 51;
179
+ */
180
+ value: HmMaintenanceProps;
181
+ case: "hmMaintenance";
176
182
  } | { case: undefined; value?: undefined };
177
183
 
178
184
  /**
@@ -187,6 +193,28 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
187
193
  * @generated from field: repeated kusinta.iot.device.v1.ClusterState clusters = 16;
188
194
  */
189
195
  clusters: ClusterState[];
196
+
197
+ /**
198
+ * Which vendor parameters this endpoint's vendor extension actually implements, in the
199
+ * vendor's own spelling — "SABOTAGE", matching (vendor_attribute) byte for byte.
200
+ *
201
+ * The vendor mirror of ClusterState.attribute_ids, and it needs its own field because a
202
+ * 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.
206
+ *
207
+ * Same reading as the Matter side: named here with no value = implemented, not yet
208
+ * reported. Absent from the list = this device does not have it. Empty = not stated,
209
+ * which is not a claim that the device implements nothing.
210
+ *
211
+ * This is what separates "no tamper detected" from "cannot detect tamper" — presence
212
+ * alone cannot, and for SABOTAGE the difference is a safety claim. A connector fills it
213
+ * at announcement from the parameter description its upstream system already holds.
214
+ *
215
+ * @generated from field: repeated string vendor_attribute_names = 17;
216
+ */
217
+ vendorAttributeNames: string[];
190
218
  };
191
219
 
192
220
  /**
@@ -13,7 +13,7 @@ import { file_kusinta_iot_vendor_homematic_v1_homematic } from "../../vendor/hom
13
13
  * Describes the file kusinta/iot/device/v1/device.proto.
14
14
  */
15
15
  export const file_kusinta_iot_device_v1_device = /*@__PURE__*/
16
- fileDesc("CiJrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEirgkKCEVuZHBvaW50EhMKC2VuZHBvaW50X2lkGAEgASgNEh0KFW1hdHRlcl9kZXZpY2VfdHlwZV9pZBgCIAEoDRJBCgp0aGVybW9zdGF0GAMgASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRoZXJtb3N0YXRQcm9wZXJ0aWVzSAASUAoSdGVtcGVyYXR1cmVfc2Vuc29yGAQgASgLMjIua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllc0gAEkoKD2h1bWlkaXR5X3NlbnNvchgFIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5IdW1pZGl0eVNlbnNvclByb3BlcnRpZXNIABJMChBvY2N1cGFuY3lfc2Vuc29yGAYgASgLMjAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXNIABJICg5jb250YWN0X3NlbnNvchgHIAEoCzIuLmt1c2ludGEuaW90LmRldmljZS52MS5Db250YWN0U2Vuc29yUHJvcGVydGllc0gAEkoKD3dpbmRvd19jb3ZlcmluZxgIIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5XaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXNIABI+Cglkb29yX2xvY2sYCSABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRG9vckxvY2tQcm9wZXJ0aWVzSAASQwoMb25fb2ZmX2xpZ2h0GAogASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9uT2ZmTGlnaHRQcm9wZXJ0aWVzSAASSAoOZGltbWFibGVfbGlnaHQYCyABKAsyLi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGltbWFibGVMaWdodFByb3BlcnRpZXNIABJSChBjb2xvcl90ZW1wX2xpZ2h0GAwgASgLMjYua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNvbG9yVGVtcGVyYXR1cmVMaWdodFByb3BlcnRpZXNIABJGCg1lbmVyZ3lfc2Vuc29yGA0gASgLMi0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkVuZXJneVNlbnNvclByb3BlcnRpZXNIABJKCg9wcmVzc3VyZV9zZW5zb3IYDiABKAsyLy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJlc3N1cmVTZW5zb3JQcm9wZXJ0aWVzSAASRAoMcG93ZXJfc291cmNlGA8gASgLMiwua3VzaW50YS5pb3QuZGV2aWNlLnYxLlBvd2VyU291cmNlUHJvcGVydGllc0gAEksKDWhtX3RoZXJtb3N0YXQYMiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtVGhlcm1vc3RhdFByb3BzSAESNQoIY2x1c3RlcnMYECADKAsyIy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlQhMKEW1hdHRlcl9wcm9wZXJ0aWVzQhMKEXZlbmRvcl9wcm9wZXJ0aWVzIrADCgZEZXZpY2USOwoKZGVzY3JpcHRvchgBIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VEZXNjcmlwdG9yEjIKCWVuZHBvaW50cxgOIAMoCzIfLmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludBItCglsYXN0X3NlZW4YFCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjAKDGxhc3RfdXBkYXRlZBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBKBAgCEA5KBAgyEDNSCnRoZXJtb3N0YXRSEnRlbXBlcmF0dXJlX3NlbnNvclIPaHVtaWRpdHlfc2Vuc29yUhBvY2N1cGFuY3lfc2Vuc29yUg5jb250YWN0X3NlbnNvclIPd2luZG93X2NvdmVyaW5nUglkb29yX2xvY2tSDG9uX29mZl9saWdodFIOZGltbWFibGVfbGlnaHRSEGNvbG9yX3RlbXBfbGlnaHRSDWVuZXJneV9zZW5zb3JSD3ByZXNzdXJlX3NlbnNvclIJaG9tZW1hdGljQgJIAWIGcHJvdG8z", [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]);
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
17
 
18
18
  /**
19
19
  * Describes the message kusinta.iot.device.v1.Endpoint.
@@ -46,6 +46,32 @@ export declare const matter_attribute: GenExtension<FieldOptions, string>;
46
46
  */
47
47
  export declare const matter_attribute_id: GenExtension<FieldOptions, number>;
48
48
 
49
+ /**
50
+ * What the Matter specification says this attribute supports, as a bitmask:
51
+ * READ = 1, WRITE = 2, REPORT = 4. So a read-only reportable attribute is 5, a
52
+ * writable one 7, a write-only one 2.
53
+ *
54
+ * Two things this is NOT.
55
+ *
56
+ * It is not PERMISSION. access/v1/acl.proto's PermissionAction and allowed_actions
57
+ * say what a given user may do; this says what the attribute is capable of. They are
58
+ * orthogonal — a user can hold WRITE on an attribute no device will ever accept a
59
+ * write for, and the schema would be lying if either could be read off the other.
60
+ *
61
+ * It is not the IMPLEMENTED SET either. This is uniform for every device that reports
62
+ * the attribute, because it comes from the specification. Whether one particular
63
+ * device implements it at all is a runtime fact, carried per endpoint by
64
+ * ClusterState.attribute_ids — Matter's own AttributeList. A device may implement
65
+ * less than the specification allows; it may not implement more.
66
+ *
67
+ * Bit 4 is Matter's subscribable/reportable quality. Named REPORT rather than EVENT
68
+ * because Matter spends "event" on a separate concept; the vendor branch's
69
+ * equivalent bit means the same thing under its own name.
70
+ *
71
+ * @generated from extension: uint32 matter_attribute_capabilities = 50009;
72
+ */
73
+ export declare const matter_attribute_capabilities: GenExtension<FieldOptions, number>;
74
+
49
75
  /**
50
76
  * The Matter device type IDs this properties message models, e.g. 0x0301 for
51
77
  * Thermostat. Repeated because one shape of properties can serve several device
@@ -9,7 +9,7 @@ import { file_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt";
9
9
  * Describes the file kusinta/iot/device/v1/matter_options.proto.
10
10
  */
11
11
  export const file_kusinta_iot_device_v1_matter_options = /*@__PURE__*/
12
- fileDesc("CiprdXNpbnRhL2lvdC9kZXZpY2UvdjEvbWF0dGVyX29wdGlvbnMucHJvdG8SFWt1c2ludGEuaW90LmRldmljZS52MTpLChFtYXR0ZXJfY2x1c3Rlcl9pZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY0YYDIAEoDVIPbWF0dGVyQ2x1c3RlcklkOkoKEG1hdHRlcl9hdHRyaWJ1dGUSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGNKGAyABKAlSD21hdHRlckF0dHJpYnV0ZTpPChNtYXR0ZXJfYXR0cmlidXRlX2lkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjWhgMgASgNUhFtYXR0ZXJBdHRyaWJ1dGVJZDpPChJtYXR0ZXJfZGV2aWNlX3R5cGUSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY04YDIAMoDVIQbWF0dGVyRGV2aWNlVHlwZTpXChZtYXR0ZXJfY29tbWFuZF9jbHVzdGVyEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGNeGAyABKA1SFG1hdHRlckNvbW1hbmRDbHVzdGVyOlAKEW1hdHRlcl9jb21tYW5kX2lkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGNiGAyABKA1SD21hdHRlckNvbW1hbmRJZIgBAUICSAFiBnByb3RvMw", [file_google_protobuf_descriptor]);
12
+ fileDesc("CiprdXNpbnRhL2lvdC9kZXZpY2UvdjEvbWF0dGVyX29wdGlvbnMucHJvdG8SFWt1c2ludGEuaW90LmRldmljZS52MTpLChFtYXR0ZXJfY2x1c3Rlcl9pZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY0YYDIAEoDVIPbWF0dGVyQ2x1c3RlcklkOkoKEG1hdHRlcl9hdHRyaWJ1dGUSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGNKGAyABKAlSD21hdHRlckF0dHJpYnV0ZTpPChNtYXR0ZXJfYXR0cmlidXRlX2lkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjWhgMgASgNUhFtYXR0ZXJBdHRyaWJ1dGVJZDpjCh1tYXR0ZXJfYXR0cmlidXRlX2NhcGFiaWxpdGllcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY2YYDIAEoDVIbbWF0dGVyQXR0cmlidXRlQ2FwYWJpbGl0aWVzOk8KEm1hdHRlcl9kZXZpY2VfdHlwZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjThgMgAygNUhBtYXR0ZXJEZXZpY2VUeXBlOlcKFm1hdHRlcl9jb21tYW5kX2NsdXN0ZXISHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY14YDIAEoDVIUbWF0dGVyQ29tbWFuZENsdXN0ZXI6UAoRbWF0dGVyX2NvbW1hbmRfaWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY2IYDIAEoDVIPbWF0dGVyQ29tbWFuZElkiAEBQgJIAWIGcHJvdG8z", [file_google_protobuf_descriptor]);
13
13
 
14
14
  /**
15
15
  * The Matter cluster this attribute belongs to, e.g. 0x0201 for Thermostat.
@@ -50,6 +50,33 @@ export const matter_attribute = /*@__PURE__*/
50
50
  export const matter_attribute_id = /*@__PURE__*/
51
51
  extDesc(file_kusinta_iot_device_v1_matter_options, 2);
52
52
 
53
+ /**
54
+ * What the Matter specification says this attribute supports, as a bitmask:
55
+ * READ = 1, WRITE = 2, REPORT = 4. So a read-only reportable attribute is 5, a
56
+ * writable one 7, a write-only one 2.
57
+ *
58
+ * Two things this is NOT.
59
+ *
60
+ * It is not PERMISSION. access/v1/acl.proto's PermissionAction and allowed_actions
61
+ * say what a given user may do; this says what the attribute is capable of. They are
62
+ * orthogonal — a user can hold WRITE on an attribute no device will ever accept a
63
+ * write for, and the schema would be lying if either could be read off the other.
64
+ *
65
+ * It is not the IMPLEMENTED SET either. This is uniform for every device that reports
66
+ * the attribute, because it comes from the specification. Whether one particular
67
+ * device implements it at all is a runtime fact, carried per endpoint by
68
+ * ClusterState.attribute_ids — Matter's own AttributeList. A device may implement
69
+ * less than the specification allows; it may not implement more.
70
+ *
71
+ * Bit 4 is Matter's subscribable/reportable quality. Named REPORT rather than EVENT
72
+ * because Matter spends "event" on a separate concept; the vendor branch's
73
+ * equivalent bit means the same thing under its own name.
74
+ *
75
+ * @generated from extension: uint32 matter_attribute_capabilities = 50009;
76
+ */
77
+ export const matter_attribute_capabilities = /*@__PURE__*/
78
+ extDesc(file_kusinta_iot_device_v1_matter_options, 3);
79
+
53
80
  /**
54
81
  * The Matter device type IDs this properties message models, e.g. 0x0301 for
55
82
  * Thermostat. Repeated because one shape of properties can serve several device
@@ -62,7 +89,7 @@ export const matter_attribute_id = /*@__PURE__*/
62
89
  * @generated from extension: repeated uint32 matter_device_type = 50003;
63
90
  */
64
91
  export const matter_device_type = /*@__PURE__*/
65
- extDesc(file_kusinta_iot_device_v1_matter_options, 3);
92
+ extDesc(file_kusinta_iot_device_v1_matter_options, 4);
66
93
 
67
94
  /**
68
95
  * The Matter cluster a command-parameters message belongs to, e.g. 0x0006 for On/Off.
@@ -71,7 +98,7 @@ export const matter_device_type = /*@__PURE__*/
71
98
  * @generated from extension: uint32 matter_command_cluster = 50007;
72
99
  */
73
100
  export const matter_command_cluster = /*@__PURE__*/
74
- extDesc(file_kusinta_iot_device_v1_matter_options, 4);
101
+ extDesc(file_kusinta_iot_device_v1_matter_options, 5);
75
102
 
76
103
  /**
77
104
  * The Matter command ID this parameters message carries arguments for, e.g. 0x00 for
@@ -87,5 +114,5 @@ export const matter_command_cluster = /*@__PURE__*/
87
114
  * @generated from extension: optional uint32 matter_command_id = 50008;
88
115
  */
89
116
  export const matter_command_id = /*@__PURE__*/
90
- extDesc(file_kusinta_iot_device_v1_matter_options, 5);
117
+ extDesc(file_kusinta_iot_device_v1_matter_options, 6);
91
118
 
@@ -71,6 +71,16 @@ export declare type ThermostatProperties = Message<"kusinta.iot.device.v1.Thermo
71
71
  * @generated from field: optional uint32 thermostat_running_mode = 10;
72
72
  */
73
73
  thermostatRunningMode?: number | undefined;
74
+
75
+ /**
76
+ * Heating demanded by the control loop, 0-100 %, which is the percentage the valve is
77
+ * open. A radiator valve's own position belongs here and not in a vendor extension: the
78
+ * Matter attribute is specified as exactly this quantity. A thermostat that drives no
79
+ * valve of its own does not implement it — see ClusterState.attribute_ids.
80
+ *
81
+ * @generated from field: optional uint32 pi_heating_demand = 11;
82
+ */
83
+ piHeatingDemand?: number | undefined;
74
84
  };
75
85
 
76
86
  /**
@@ -389,6 +399,10 @@ export declare type DimmableLightProperties = Message<"kusinta.iot.device.v1.Dim
389
399
  startUpCurrentLevel?: number | undefined;
390
400
 
391
401
  /**
402
+ * READ only: the Matter data model marks RemainingTime changes-omitted, so it is
403
+ * readable but never reported — it counts down continuously and reporting it would be
404
+ * a subscription storm.
405
+ *
392
406
  * @generated from field: optional uint32 remaining_time = 7;
393
407
  */
394
408
  remainingTime?: number | undefined;
@@ -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("CiZrdXNpbnRhL2lvdC9kZXZpY2UvdjEvcHJvcGVydGllcy5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIv8HChRUaGVybW9zdGF0UHJvcGVydGllcxI9ChFsb2NhbF90ZW1wZXJhdHVyZRgBIAEoEUIdiLUYgQSStRgQTG9jYWxUZW1wZXJhdHVyZbC1GABIAIgBARJMChlvY2N1cGllZF9oZWF0aW5nX3NldHBvaW50GAIgASgRQiSItRiBBJK1GBdPY2N1cGllZEhlYXRpbmdTZXRwb2ludLC1GBJIAYgBARJMChlvY2N1cGllZF9jb29saW5nX3NldHBvaW50GAMgASgRQiSItRiBBJK1GBdPY2N1cGllZENvb2xpbmdTZXRwb2ludLC1GBFIAogBARJHChdtaW5faGVhdF9zZXRwb2ludF9saW1pdBgEIAEoEUIhiLUYgQSStRgUTWluSGVhdFNldHBvaW50TGltaXSwtRgVSAOIAQESRwoXbWF4X2hlYXRfc2V0cG9pbnRfbGltaXQYBSABKBFCIYi1GIEEkrUYFE1heEhlYXRTZXRwb2ludExpbWl0sLUYFkgEiAEBEkcKF21pbl9jb29sX3NldHBvaW50X2xpbWl0GAYgASgRQiGItRiBBJK1GBRNaW5Db29sU2V0cG9pbnRMaW1pdLC1GBdIBYgBARJHChdtYXhfY29vbF9zZXRwb2ludF9saW1pdBgHIAEoEUIhiLUYgQSStRgUTWF4Q29vbFNldHBvaW50TGltaXSwtRgYSAaIAQESUwodY29udHJvbF9zZXF1ZW5jZV9vZl9vcGVyYXRpb24YCCABKA1CJ4i1GIEEkrUYGkNvbnRyb2xTZXF1ZW5jZU9mT3BlcmF0aW9usLUYG0gHiAEBEjEKC3N5c3RlbV9tb2RlGAkgASgNQheItRiBBJK1GApTeXN0ZW1Nb2RlsLUYHEgIiAEBEkgKF3RoZXJtb3N0YXRfcnVubmluZ19tb2RlGAogASgNQiKItRiBBJK1GBVUaGVybW9zdGF0UnVubmluZ01vZGWwtRgeSAmIAQE6Bpq1GAKBBkIUChJfbG9jYWxfdGVtcGVyYXR1cmVCHAoaX29jY3VwaWVkX2hlYXRpbmdfc2V0cG9pbnRCHAoaX29jY3VwaWVkX2Nvb2xpbmdfc2V0cG9pbnRCGgoYX21pbl9oZWF0X3NldHBvaW50X2xpbWl0QhoKGF9tYXhfaGVhdF9zZXRwb2ludF9saW1pdEIaChhfbWluX2Nvb2xfc2V0cG9pbnRfbGltaXRCGgoYX21heF9jb29sX3NldHBvaW50X2xpbWl0QiAKHl9jb250cm9sX3NlcXVlbmNlX29mX29wZXJhdGlvbkIOCgxfc3lzdGVtX21vZGVCGgoYX3RoZXJtb3N0YXRfcnVubmluZ19tb2RlIt0CChtUZW1wZXJhdHVyZVNlbnNvclByb3BlcnRpZXMSNwoObWVhc3VyZWRfdmFsdWUYASABKBFCGoi1GIIIkrUYDU1lYXN1cmVkVmFsdWWwtRgASACIAQESPgoSbWluX21lYXN1cmVkX3ZhbHVlGAIgASgRQh2ItRiCCJK1GBBNaW5NZWFzdXJlZFZhbHVlsLUYAUgBiAEBEj4KEm1heF9tZWFzdXJlZF92YWx1ZRgDIAEoEUIdiLUYggiStRgQTWF4TWVhc3VyZWRWYWx1ZbC1GAJIAogBARIuCgl0b2xlcmFuY2UYBCABKA1CFoi1GIIIkrUYCVRvbGVyYW5jZbC1GANIA4gBAToGmrUYAoIGQhEKD19tZWFzdXJlZF92YWx1ZUIVChNfbWluX21lYXN1cmVkX3ZhbHVlQhUKE19tYXhfbWVhc3VyZWRfdmFsdWVCDAoKX3RvbGVyYW5jZSLaAgoYSHVtaWRpdHlTZW5zb3JQcm9wZXJ0aWVzEjcKDm1lYXN1cmVkX3ZhbHVlGAEgASgNQhqItRiFCJK1GA1NZWFzdXJlZFZhbHVlsLUYAEgAiAEBEj4KEm1pbl9tZWFzdXJlZF92YWx1ZRgCIAEoDUIdiLUYhQiStRgQTWluTWVhc3VyZWRWYWx1ZbC1GAFIAYgBARI+ChJtYXhfbWVhc3VyZWRfdmFsdWUYAyABKA1CHYi1GIUIkrUYEE1heE1lYXN1cmVkVmFsdWWwtRgCSAKIAQESLgoJdG9sZXJhbmNlGAQgASgNQhaItRiFCJK1GAlUb2xlcmFuY2WwtRgDSAOIAQE6Bpq1GAKHBkIRCg9fbWVhc3VyZWRfdmFsdWVCFQoTX21pbl9tZWFzdXJlZF92YWx1ZUIVChNfbWF4X21lYXN1cmVkX3ZhbHVlQgwKCl90b2xlcmFuY2Ui4wQKGU9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXMSLgoJb2NjdXBhbmN5GAEgASgNQhaItRiGCJK1GAlPY2N1cGFuY3mwtRgASACIAQESRAoVb2NjdXBhbmN5X3NlbnNvcl90eXBlGAIgASgNQiCItRiGCJK1GBNPY2N1cGFuY3lTZW5zb3JUeXBlsLUYAUgBiAEBElEKHG9jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXAYAyABKA1CJoi1GIYIkrUYGU9jY3VwYW5jeVNlbnNvclR5cGVCaXRtYXCwtRgCSAKIAQESWAogcGlyX29jY3VwaWVkX3RvX3Vub2NjdXBpZWRfZGVsYXkYBCABKA1CKYi1GIYIkrUYHFBJUk9jY3VwaWVkVG9Vbm9jY3VwaWVkRGVsYXmwtRgQSAOIAQESWAogcGlyX3Vub2NjdXBpZWRfdG9fb2NjdXBpZWRfZGVsYXkYBSABKA1CKYi1GIYIkrUYHFBJUlVub2NjdXBpZWRUb09jY3VwaWVkRGVsYXmwtRgRSASIAQE6Bpq1GAKHAkIMCgpfb2NjdXBhbmN5QhgKFl9vY2N1cGFuY3lfc2Vuc29yX3R5cGVCHwodX29jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXBCIwohX3Bpcl9vY2N1cGllZF90b191bm9jY3VwaWVkX2RlbGF5QiMKIV9waXJfdW5vY2N1cGllZF90b19vY2N1cGllZF9kZWxheVIWcGlyX29jY190b191bm9jY19kZWxheVIWcGlyX3Vub2NjX3RvX29jY19kZWxheSJiChdDb250YWN0U2Vuc29yUHJvcGVydGllcxIwCgtzdGF0ZV92YWx1ZRgBIAEoCEIWiLUYRZK1GApTdGF0ZVZhbHVlsLUYAEgAiAEBOgWatRgBFUIOCgxfc3RhdGVfdmFsdWUi2QYKGFdpbmRvd0NvdmVyaW5nUHJvcGVydGllcxItCg1jb3ZlcmluZ190eXBlGAEgASgNQhGItRiCApK1GARUeXBlsLUYAEgAiAEBEl8KI2N1cnJlbnRfcG9zaXRpb25fbGlmdF9wZXJjZW50MTAwdGhzGAIgASgNQi2ItRiCApK1GCBDdXJyZW50UG9zaXRpb25MaWZ0UGVyY2VudDEwMHRoc7C1GA5IAYgBARJfCiNjdXJyZW50X3Bvc2l0aW9uX3RpbHRfcGVyY2VudDEwMHRocxgDIAEoDUItiLUYggKStRggQ3VycmVudFBvc2l0aW9uVGlsdFBlcmNlbnQxMDB0aHOwtRgPSAKIAQESXQoidGFyZ2V0X3Bvc2l0aW9uX2xpZnRfcGVyY2VudDEwMHRocxgEIAEoDUIsiLUYggKStRgfVGFyZ2V0UG9zaXRpb25MaWZ0UGVyY2VudDEwMHRoc7C1GAtIA4gBARJdCiJ0YXJnZXRfcG9zaXRpb25fdGlsdF9wZXJjZW50MTAwdGhzGAUgASgNQiyItRiCApK1GB9UYXJnZXRQb3NpdGlvblRpbHRQZXJjZW50MTAwdGhzsLUYDEgEiAEBEj8KEm9wZXJhdGlvbmFsX3N0YXR1cxgGIAEoDUIeiLUYggKStRgRT3BlcmF0aW9uYWxTdGF0dXOwtRgKSAWIAQESOgoQZW5kX3Byb2R1Y3RfdHlwZRgHIAEoDUIbiLUYggKStRgORW5kUHJvZHVjdFR5cGWwtRgNSAaIAQESJAoEbW9kZRgIIAEoDUIRiLUYggKStRgETW9kZbC1GBdIB4gBAToGmrUYAoIEQhAKDl9jb3ZlcmluZ190eXBlQiYKJF9jdXJyZW50X3Bvc2l0aW9uX2xpZnRfcGVyY2VudDEwMHRoc0ImCiRfY3VycmVudF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCFQoTX29wZXJhdGlvbmFsX3N0YXR1c0ITChFfZW5kX3Byb2R1Y3RfdHlwZUIHCgVfbW9kZSL2AgoSRG9vckxvY2tQcm9wZXJ0aWVzEi8KCmxvY2tfc3RhdGUYASABKA1CFoi1GIECkrUYCUxvY2tTdGF0ZbC1GABIAIgBARItCglsb2NrX3R5cGUYAiABKA1CFYi1GIECkrUYCExvY2tUeXBlsLUYAUgBiAEBEjsKEGFjdHVhdG9yX2VuYWJsZWQYAyABKAhCHIi1GIECkrUYD0FjdHVhdG9yRW5hYmxlZLC1GAJIAogBARIvCgpkb29yX3N0YXRlGAQgASgNQhaItRiBApK1GAlEb29yU3RhdGWwtRgDSAOIAQESNwoOb3BlcmF0aW5nX21vZGUYBSABKA1CGoi1GIECkrUYDU9wZXJhdGluZ01vZGWwtRglSASIAQE6BZq1GAEKQg0KC19sb2NrX3N0YXRlQgwKCl9sb2NrX3R5cGVCEwoRX2FjdHVhdG9yX2VuYWJsZWRCDQoLX2Rvb3Jfc3RhdGVCEQoPX29wZXJhdGluZ19tb2RlIv4CChRPbk9mZkxpZ2h0UHJvcGVydGllcxImCgZvbl9vZmYYASABKAhCEYi1GAaStRgFT25PZmawtRgASACIAQESQwoUZ2xvYmFsX3NjZW5lX2NvbnRyb2wYAiABKAhCIIi1GAaStRgSR2xvYmFsU2NlbmVDb250cm9ssLUYgIABSAGIAQESKgoHb25fdGltZRgDIAEoDUIUiLUYBpK1GAZPblRpbWWwtRiBgAFIAogBARI1Cg1vZmZfd2FpdF90aW1lGAQgASgNQhmItRgGkrUYC09mZldhaXRUaW1lsLUYgoABSAOIAQESOAoPc3RhcnRfdXBfb25fb2ZmGAUgASgNQhqItRgGkrUYDFN0YXJ0VXBPbk9mZrC1GIOAAUgEiAEBOgaatRgCgAJCCQoHX29uX29mZkIXChVfZ2xvYmFsX3NjZW5lX2NvbnRyb2xCCgoIX29uX3RpbWVCEAoOX29mZl93YWl0X3RpbWVCEgoQX3N0YXJ0X3VwX29uX29mZiL7AwoXRGltbWFibGVMaWdodFByb3BlcnRpZXMSJgoGb25fb2ZmGAEgASgIQhGItRgGkrUYBU9uT2ZmsLUYAEgAiAEBEjQKDWN1cnJlbnRfbGV2ZWwYAiABKA1CGIi1GAiStRgMQ3VycmVudExldmVssLUYAEgBiAEBEiwKCW1pbl9sZXZlbBgDIAEoDUIUiLUYCJK1GAhNaW5MZXZlbLC1GAJIAogBARIsCgltYXhfbGV2ZWwYBCABKA1CFIi1GAiStRgITWF4TGV2ZWywtRgDSAOIAQESKgoIb25fbGV2ZWwYBSABKA1CE4i1GAiStRgHT25MZXZlbLC1GBFIBIgBARJGChZzdGFydF91cF9jdXJyZW50X2xldmVsGAYgASgNQiGItRgIkrUYE1N0YXJ0VXBDdXJyZW50TGV2ZWywtRiAgAFIBYgBARI2Cg5yZW1haW5pbmdfdGltZRgHIAEoDUIZiLUYCJK1GA1SZW1haW5pbmdUaW1lsLUYAUgGiAEBOgaatRgCgQJCCQoHX29uX29mZkIQCg5fY3VycmVudF9sZXZlbEIMCgpfbWluX2xldmVsQgwKCl9tYXhfbGV2ZWxCCwoJX29uX2xldmVsQhkKF19zdGFydF91cF9jdXJyZW50X2xldmVsQhEKD19yZW1haW5pbmdfdGltZSLFBQofQ29sb3JUZW1wZXJhdHVyZUxpZ2h0UHJvcGVydGllcxImCgZvbl9vZmYYASABKAhCEYi1GAaStRgFT25PZmawtRgASACIAQESNAoNY3VycmVudF9sZXZlbBgCIAEoDUIYiLUYCJK1GAxDdXJyZW50TGV2ZWywtRgASAGIAQESSgoYY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzGAMgASgNQiOItRiABpK1GBZDb2xvclRlbXBlcmF0dXJlTWlyZWRzsLUYB0gCiAEBElYKHmNvbG9yX3RlbXBfcGh5c2ljYWxfbWluX21pcmVkcxgEIAEoDUIpiLUYgAaStRgaQ29sb3JUZW1wUGh5c2ljYWxNaW5NaXJlZHOwtRiLgAFIA4gBARJWCh5jb2xvcl90ZW1wX3BoeXNpY2FsX21heF9taXJlZHMYBSABKA1CKYi1GIAGkrUYGkNvbG9yVGVtcFBoeXNpY2FsTWF4TWlyZWRzsLUYjIABSASIAQESWwogc3RhcnR1cF9jb2xvcl90ZW1wZXJhdHVyZV9taXJlZHMYBiABKA1CLIi1GIAGkrUYHVN0YXJ0VXBDb2xvclRlbXBlcmF0dXJlTWlyZWRzsLUYkIABSAWIAQESLwoKY29sb3JfbW9kZRgHIAEoDUIWiLUYgAaStRgJQ29sb3JNb2RlsLUYCEgGiAEBOgaatRgCjAJCCQoHX29uX29mZkIQCg5fY3VycmVudF9sZXZlbEIbChlfY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzQiEKH19jb2xvcl90ZW1wX3BoeXNpY2FsX21pbl9taXJlZHNCIQofX2NvbG9yX3RlbXBfcGh5c2ljYWxfbWF4X21pcmVkc0IjCiFfc3RhcnR1cF9jb2xvcl90ZW1wZXJhdHVyZV9taXJlZHNCDQoLX2NvbG9yX21vZGUi6AIKFkVuZXJneVNlbnNvclByb3BlcnRpZXMSMwoMYWN0aXZlX3Bvd2VyGAUgASgSQhiItRiQAZK1GAtBY3RpdmVQb3dlcrC1GAhIAIgBARIqCgd2b2x0YWdlGAYgASgSQhSItRiQAZK1GAdWb2x0YWdlsLUYBEgBiAEBEjcKDmFjdGl2ZV9jdXJyZW50GAcgASgSQhqItRiQAZK1GA1BY3RpdmVDdXJyZW50sLUYBUgCiAEBEi4KCWZyZXF1ZW5jeRgIIAEoEkIWiLUYkAGStRgJRnJlcXVlbmN5sLUYDkgDiAEBOgaatRgCkApCDwoNX2FjdGl2ZV9wb3dlckIKCghfdm9sdGFnZUIRCg9fYWN0aXZlX2N1cnJlbnRCDAoKX2ZyZXF1ZW5jeUoECAEQAkoECAIQA0oECAMQBEoECAQQBVILcm1zX3ZvbHRhZ2VSC3Jtc19jdXJyZW50UgxhY19mcmVxdWVuY3ki2gIKGFByZXNzdXJlU2Vuc29yUHJvcGVydGllcxI3Cg5tZWFzdXJlZF92YWx1ZRgBIAEoEUIaiLUYgwiStRgNTWVhc3VyZWRWYWx1ZbC1GABIAIgBARI+ChJtaW5fbWVhc3VyZWRfdmFsdWUYAiABKBFCHYi1GIMIkrUYEE1pbk1lYXN1cmVkVmFsdWWwtRgBSAGIAQESPgoSbWF4X21lYXN1cmVkX3ZhbHVlGAMgASgRQh2ItRiDCJK1GBBNYXhNZWFzdXJlZFZhbHVlsLUYAkgCiAEBEi4KCXRvbGVyYW5jZRgEIAEoDUIWiLUYgwiStRgJVG9sZXJhbmNlsLUYA0gDiAEBOgaatRgChQZCEQoPX21lYXN1cmVkX3ZhbHVlQhUKE19taW5fbWVhc3VyZWRfdmFsdWVCFQoTX21heF9tZWFzdXJlZF92YWx1ZUIMCgpfdG9sZXJhbmNlIqUDChVQb3dlclNvdXJjZVByb3BlcnRpZXMSQwoVYmF0X3BlcmNlbnRfcmVtYWluaW5nGAEgASgNQh+ItRgvkrUYE0JhdFBlcmNlbnRSZW1haW5pbmewtRgMSACIAQESOQoQYmF0X2NoYXJnZV9sZXZlbBgCIAEoDUIaiLUYL5K1GA5CYXRDaGFyZ2VMZXZlbLC1GA5IAYgBARJFChZiYXRfcmVwbGFjZW1lbnRfbmVlZGVkGAMgASgIQiCItRgvkrUYFEJhdFJlcGxhY2VtZW50TmVlZGVksLUYD0gCiAEBEjAKC2JhdF92b2x0YWdlGAQgASgNQhaItRgvkrUYCkJhdFZvbHRhZ2WwtRgLSAOIAQESJwoGc3RhdHVzGAUgASgNQhKItRgvkrUYBlN0YXR1c7C1GABIBIgBAToFmrUYARFCGAoWX2JhdF9wZXJjZW50X3JlbWFpbmluZ0ITChFfYmF0X2NoYXJnZV9sZXZlbEIZChdfYmF0X3JlcGxhY2VtZW50X25lZWRlZEIOCgxfYmF0X3ZvbHRhZ2VCCQoHX3N0YXR1c0ICSAFiBnByb3RvMw", [file_kusinta_iot_device_v1_matter_options]);
12
+ fileDesc("CiZrdXNpbnRhL2lvdC9kZXZpY2UvdjEvcHJvcGVydGllcy5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIv8IChRUaGVybW9zdGF0UHJvcGVydGllcxJBChFsb2NhbF90ZW1wZXJhdHVyZRgBIAEoEUIhiLUYgQSStRgQTG9jYWxUZW1wZXJhdHVyZbC1GADItRgFSACIAQESUAoZb2NjdXBpZWRfaGVhdGluZ19zZXRwb2ludBgCIAEoEUIoiLUYgQSStRgXT2NjdXBpZWRIZWF0aW5nU2V0cG9pbnSwtRgSyLUYB0gBiAEBElAKGW9jY3VwaWVkX2Nvb2xpbmdfc2V0cG9pbnQYAyABKBFCKIi1GIEEkrUYF09jY3VwaWVkQ29vbGluZ1NldHBvaW50sLUYEci1GAdIAogBARJLChdtaW5faGVhdF9zZXRwb2ludF9saW1pdBgEIAEoEUIliLUYgQSStRgUTWluSGVhdFNldHBvaW50TGltaXSwtRgVyLUYB0gDiAEBEksKF21heF9oZWF0X3NldHBvaW50X2xpbWl0GAUgASgRQiWItRiBBJK1GBRNYXhIZWF0U2V0cG9pbnRMaW1pdLC1GBbItRgHSASIAQESSwoXbWluX2Nvb2xfc2V0cG9pbnRfbGltaXQYBiABKBFCJYi1GIEEkrUYFE1pbkNvb2xTZXRwb2ludExpbWl0sLUYF8i1GAdIBYgBARJLChdtYXhfY29vbF9zZXRwb2ludF9saW1pdBgHIAEoEUIliLUYgQSStRgUTWF4Q29vbFNldHBvaW50TGltaXSwtRgYyLUYB0gGiAEBElcKHWNvbnRyb2xfc2VxdWVuY2Vfb2Zfb3BlcmF0aW9uGAggASgNQiuItRiBBJK1GBpDb250cm9sU2VxdWVuY2VPZk9wZXJhdGlvbrC1GBvItRgHSAeIAQESNQoLc3lzdGVtX21vZGUYCSABKA1CG4i1GIEEkrUYClN5c3RlbU1vZGWwtRgcyLUYB0gIiAEBEkwKF3RoZXJtb3N0YXRfcnVubmluZ19tb2RlGAogASgNQiaItRiBBJK1GBVUaGVybW9zdGF0UnVubmluZ01vZGWwtRgeyLUYBUgJiAEBEkAKEXBpX2hlYXRpbmdfZGVtYW5kGAsgASgNQiCItRiBBJK1GA9QSUhlYXRpbmdEZW1hbmSwtRgIyLUYBUgKiAEBOgaatRgCgQZCFAoSX2xvY2FsX3RlbXBlcmF0dXJlQhwKGl9vY2N1cGllZF9oZWF0aW5nX3NldHBvaW50QhwKGl9vY2N1cGllZF9jb29saW5nX3NldHBvaW50QhoKGF9taW5faGVhdF9zZXRwb2ludF9saW1pdEIaChhfbWF4X2hlYXRfc2V0cG9pbnRfbGltaXRCGgoYX21pbl9jb29sX3NldHBvaW50X2xpbWl0QhoKGF9tYXhfY29vbF9zZXRwb2ludF9saW1pdEIgCh5fY29udHJvbF9zZXF1ZW5jZV9vZl9vcGVyYXRpb25CDgoMX3N5c3RlbV9tb2RlQhoKGF90aGVybW9zdGF0X3J1bm5pbmdfbW9kZUIUChJfcGlfaGVhdGluZ19kZW1hbmQi7QIKG1RlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllcxI7Cg5tZWFzdXJlZF92YWx1ZRgBIAEoEUIeiLUYggiStRgNTWVhc3VyZWRWYWx1ZbC1GADItRgFSACIAQESQgoSbWluX21lYXN1cmVkX3ZhbHVlGAIgASgRQiGItRiCCJK1GBBNaW5NZWFzdXJlZFZhbHVlsLUYAci1GAVIAYgBARJCChJtYXhfbWVhc3VyZWRfdmFsdWUYAyABKBFCIYi1GIIIkrUYEE1heE1lYXN1cmVkVmFsdWWwtRgCyLUYBUgCiAEBEjIKCXRvbGVyYW5jZRgEIAEoDUIaiLUYggiStRgJVG9sZXJhbmNlsLUYA8i1GAVIA4gBAToGmrUYAoIGQhEKD19tZWFzdXJlZF92YWx1ZUIVChNfbWluX21lYXN1cmVkX3ZhbHVlQhUKE19tYXhfbWVhc3VyZWRfdmFsdWVCDAoKX3RvbGVyYW5jZSLqAgoYSHVtaWRpdHlTZW5zb3JQcm9wZXJ0aWVzEjsKDm1lYXN1cmVkX3ZhbHVlGAEgASgNQh6ItRiFCJK1GA1NZWFzdXJlZFZhbHVlsLUYAMi1GAVIAIgBARJCChJtaW5fbWVhc3VyZWRfdmFsdWUYAiABKA1CIYi1GIUIkrUYEE1pbk1lYXN1cmVkVmFsdWWwtRgByLUYBUgBiAEBEkIKEm1heF9tZWFzdXJlZF92YWx1ZRgDIAEoDUIhiLUYhQiStRgQTWF4TWVhc3VyZWRWYWx1ZbC1GALItRgFSAKIAQESMgoJdG9sZXJhbmNlGAQgASgNQhqItRiFCJK1GAlUb2xlcmFuY2WwtRgDyLUYBUgDiAEBOgaatRgChwZCEQoPX21lYXN1cmVkX3ZhbHVlQhUKE19taW5fbWVhc3VyZWRfdmFsdWVCFQoTX21heF9tZWFzdXJlZF92YWx1ZUIMCgpfdG9sZXJhbmNlIvcEChlPY2N1cGFuY3lTZW5zb3JQcm9wZXJ0aWVzEjIKCW9jY3VwYW5jeRgBIAEoDUIaiLUYhgiStRgJT2NjdXBhbmN5sLUYAMi1GAVIAIgBARJIChVvY2N1cGFuY3lfc2Vuc29yX3R5cGUYAiABKA1CJIi1GIYIkrUYE09jY3VwYW5jeVNlbnNvclR5cGWwtRgByLUYBUgBiAEBElUKHG9jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXAYAyABKA1CKoi1GIYIkrUYGU9jY3VwYW5jeVNlbnNvclR5cGVCaXRtYXCwtRgCyLUYBUgCiAEBElwKIHBpcl9vY2N1cGllZF90b191bm9jY3VwaWVkX2RlbGF5GAQgASgNQi2ItRiGCJK1GBxQSVJPY2N1cGllZFRvVW5vY2N1cGllZERlbGF5sLUYEMi1GAdIA4gBARJcCiBwaXJfdW5vY2N1cGllZF90b19vY2N1cGllZF9kZWxheRgFIAEoDUItiLUYhgiStRgcUElSVW5vY2N1cGllZFRvT2NjdXBpZWREZWxhebC1GBHItRgHSASIAQE6Bpq1GAKHAkIMCgpfb2NjdXBhbmN5QhgKFl9vY2N1cGFuY3lfc2Vuc29yX3R5cGVCHwodX29jY3VwYW5jeV9zZW5zb3JfdHlwZV9iaXRtYXBCIwohX3Bpcl9vY2N1cGllZF90b191bm9jY3VwaWVkX2RlbGF5QiMKIV9waXJfdW5vY2N1cGllZF90b19vY2N1cGllZF9kZWxheVIWcGlyX29jY190b191bm9jY19kZWxheVIWcGlyX3Vub2NjX3RvX29jY19kZWxheSJmChdDb250YWN0U2Vuc29yUHJvcGVydGllcxI0CgtzdGF0ZV92YWx1ZRgBIAEoCEIaiLUYRZK1GApTdGF0ZVZhbHVlsLUYAMi1GAVIAIgBAToFmrUYARVCDgoMX3N0YXRlX3ZhbHVlIvkGChhXaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXMSMQoNY292ZXJpbmdfdHlwZRgBIAEoDUIViLUYggKStRgEVHlwZbC1GADItRgFSACIAQESYwojY3VycmVudF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHMYAiABKA1CMYi1GIICkrUYIEN1cnJlbnRQb3NpdGlvbkxpZnRQZXJjZW50MTAwdGhzsLUYDsi1GAVIAYgBARJjCiNjdXJyZW50X3Bvc2l0aW9uX3RpbHRfcGVyY2VudDEwMHRocxgDIAEoDUIxiLUYggKStRggQ3VycmVudFBvc2l0aW9uVGlsdFBlcmNlbnQxMDB0aHOwtRgPyLUYBUgCiAEBEmEKInRhcmdldF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHMYBCABKA1CMIi1GIICkrUYH1RhcmdldFBvc2l0aW9uTGlmdFBlcmNlbnQxMDB0aHOwtRgLyLUYBUgDiAEBEmEKInRhcmdldF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHMYBSABKA1CMIi1GIICkrUYH1RhcmdldFBvc2l0aW9uVGlsdFBlcmNlbnQxMDB0aHOwtRgMyLUYBUgEiAEBEkMKEm9wZXJhdGlvbmFsX3N0YXR1cxgGIAEoDUIiiLUYggKStRgRT3BlcmF0aW9uYWxTdGF0dXOwtRgKyLUYBUgFiAEBEj4KEGVuZF9wcm9kdWN0X3R5cGUYByABKA1CH4i1GIICkrUYDkVuZFByb2R1Y3RUeXBlsLUYDci1GAVIBogBARIoCgRtb2RlGAggASgNQhWItRiCApK1GARNb2RlsLUYF8i1GAdIB4gBAToGmrUYAoIEQhAKDl9jb3ZlcmluZ190eXBlQiYKJF9jdXJyZW50X3Bvc2l0aW9uX2xpZnRfcGVyY2VudDEwMHRoc0ImCiRfY3VycmVudF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl9saWZ0X3BlcmNlbnQxMDB0aHNCJQojX3RhcmdldF9wb3NpdGlvbl90aWx0X3BlcmNlbnQxMDB0aHNCFQoTX29wZXJhdGlvbmFsX3N0YXR1c0ITChFfZW5kX3Byb2R1Y3RfdHlwZUIHCgVfbW9kZSKKAwoSRG9vckxvY2tQcm9wZXJ0aWVzEjMKCmxvY2tfc3RhdGUYASABKA1CGoi1GIECkrUYCUxvY2tTdGF0ZbC1GADItRgFSACIAQESMQoJbG9ja190eXBlGAIgASgNQhmItRiBApK1GAhMb2NrVHlwZbC1GAHItRgFSAGIAQESPwoQYWN0dWF0b3JfZW5hYmxlZBgDIAEoCEIgiLUYgQKStRgPQWN0dWF0b3JFbmFibGVksLUYAsi1GAVIAogBARIzCgpkb29yX3N0YXRlGAQgASgNQhqItRiBApK1GAlEb29yU3RhdGWwtRgDyLUYBUgDiAEBEjsKDm9wZXJhdGluZ19tb2RlGAUgASgNQh6ItRiBApK1GA1PcGVyYXRpbmdNb2RlsLUYJci1GAdIBIgBAToFmrUYAQpCDQoLX2xvY2tfc3RhdGVCDAoKX2xvY2tfdHlwZUITChFfYWN0dWF0b3JfZW5hYmxlZEINCgtfZG9vcl9zdGF0ZUIRCg9fb3BlcmF0aW5nX21vZGUikgMKFE9uT2ZmTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESRwoUZ2xvYmFsX3NjZW5lX2NvbnRyb2wYAiABKAhCJIi1GAaStRgSR2xvYmFsU2NlbmVDb250cm9ssLUYgIAByLUYBUgBiAEBEi4KB29uX3RpbWUYAyABKA1CGIi1GAaStRgGT25UaW1lsLUYgYAByLUYB0gCiAEBEjkKDW9mZl93YWl0X3RpbWUYBCABKA1CHYi1GAaStRgLT2ZmV2FpdFRpbWWwtRiCgAHItRgHSAOIAQESPAoPc3RhcnRfdXBfb25fb2ZmGAUgASgNQh6ItRgGkrUYDFN0YXJ0VXBPbk9mZrC1GIOAAci1GAdIBIgBAToGmrUYAoACQgkKB19vbl9vZmZCFwoVX2dsb2JhbF9zY2VuZV9jb250cm9sQgoKCF9vbl90aW1lQhAKDl9vZmZfd2FpdF90aW1lQhIKEF9zdGFydF91cF9vbl9vZmYilwQKF0RpbW1hYmxlTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESOAoNY3VycmVudF9sZXZlbBgCIAEoDUIciLUYCJK1GAxDdXJyZW50TGV2ZWywtRgAyLUYBUgBiAEBEjAKCW1pbl9sZXZlbBgDIAEoDUIYiLUYCJK1GAhNaW5MZXZlbLC1GALItRgFSAKIAQESMAoJbWF4X2xldmVsGAQgASgNQhiItRgIkrUYCE1heExldmVssLUYA8i1GAVIA4gBARIuCghvbl9sZXZlbBgFIAEoDUIXiLUYCJK1GAdPbkxldmVssLUYEci1GAdIBIgBARJKChZzdGFydF91cF9jdXJyZW50X2xldmVsGAYgASgNQiWItRgIkrUYE1N0YXJ0VXBDdXJyZW50TGV2ZWywtRiAgAHItRgHSAWIAQESOgoOcmVtYWluaW5nX3RpbWUYByABKA1CHYi1GAiStRgNUmVtYWluaW5nVGltZbC1GAHItRgBSAaIAQE6Bpq1GAKBAkIJCgdfb25fb2ZmQhAKDl9jdXJyZW50X2xldmVsQgwKCl9taW5fbGV2ZWxCDAoKX21heF9sZXZlbEILCglfb25fbGV2ZWxCGQoXX3N0YXJ0X3VwX2N1cnJlbnRfbGV2ZWxCEQoPX3JlbWFpbmluZ190aW1lIuEFCh9Db2xvclRlbXBlcmF0dXJlTGlnaHRQcm9wZXJ0aWVzEioKBm9uX29mZhgBIAEoCEIViLUYBpK1GAVPbk9mZrC1GADItRgFSACIAQESOAoNY3VycmVudF9sZXZlbBgCIAEoDUIciLUYCJK1GAxDdXJyZW50TGV2ZWywtRgAyLUYBUgBiAEBEk4KGGNvbG9yX3RlbXBlcmF0dXJlX21pcmVkcxgDIAEoDUIniLUYgAaStRgWQ29sb3JUZW1wZXJhdHVyZU1pcmVkc7C1GAfItRgFSAKIAQESWgoeY29sb3JfdGVtcF9waHlzaWNhbF9taW5fbWlyZWRzGAQgASgNQi2ItRiABpK1GBpDb2xvclRlbXBQaHlzaWNhbE1pbk1pcmVkc7C1GIuAAci1GAVIA4gBARJaCh5jb2xvcl90ZW1wX3BoeXNpY2FsX21heF9taXJlZHMYBSABKA1CLYi1GIAGkrUYGkNvbG9yVGVtcFBoeXNpY2FsTWF4TWlyZWRzsLUYjIAByLUYBUgEiAEBEl8KIHN0YXJ0dXBfY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzGAYgASgNQjCItRiABpK1GB1TdGFydFVwQ29sb3JUZW1wZXJhdHVyZU1pcmVkc7C1GJCAAci1GAdIBYgBARIzCgpjb2xvcl9tb2RlGAcgASgNQhqItRiABpK1GAlDb2xvck1vZGWwtRgIyLUYBUgGiAEBOgaatRgCjAJCCQoHX29uX29mZkIQCg5fY3VycmVudF9sZXZlbEIbChlfY29sb3JfdGVtcGVyYXR1cmVfbWlyZWRzQiEKH19jb2xvcl90ZW1wX3BoeXNpY2FsX21pbl9taXJlZHNCIQofX2NvbG9yX3RlbXBfcGh5c2ljYWxfbWF4X21pcmVkc0IjCiFfc3RhcnR1cF9jb2xvcl90ZW1wZXJhdHVyZV9taXJlZHNCDQoLX2NvbG9yX21vZGUi+AIKFkVuZXJneVNlbnNvclByb3BlcnRpZXMSNwoMYWN0aXZlX3Bvd2VyGAUgASgSQhyItRiQAZK1GAtBY3RpdmVQb3dlcrC1GAjItRgFSACIAQESLgoHdm9sdGFnZRgGIAEoEkIYiLUYkAGStRgHVm9sdGFnZbC1GATItRgFSAGIAQESOwoOYWN0aXZlX2N1cnJlbnQYByABKBJCHoi1GJABkrUYDUFjdGl2ZUN1cnJlbnSwtRgFyLUYBUgCiAEBEjIKCWZyZXF1ZW5jeRgIIAEoEkIaiLUYkAGStRgJRnJlcXVlbmN5sLUYDsi1GAVIA4gBAToGmrUYApAKQg8KDV9hY3RpdmVfcG93ZXJCCgoIX3ZvbHRhZ2VCEQoPX2FjdGl2ZV9jdXJyZW50QgwKCl9mcmVxdWVuY3lKBAgBEAJKBAgCEANKBAgDEARKBAgEEAVSC3Jtc192b2x0YWdlUgtybXNfY3VycmVudFIMYWNfZnJlcXVlbmN5IuoCChhQcmVzc3VyZVNlbnNvclByb3BlcnRpZXMSOwoObWVhc3VyZWRfdmFsdWUYASABKBFCHoi1GIMIkrUYDU1lYXN1cmVkVmFsdWWwtRgAyLUYBUgAiAEBEkIKEm1pbl9tZWFzdXJlZF92YWx1ZRgCIAEoEUIhiLUYgwiStRgQTWluTWVhc3VyZWRWYWx1ZbC1GAHItRgFSAGIAQESQgoSbWF4X21lYXN1cmVkX3ZhbHVlGAMgASgRQiGItRiDCJK1GBBNYXhNZWFzdXJlZFZhbHVlsLUYAsi1GAVIAogBARIyCgl0b2xlcmFuY2UYBCABKA1CGoi1GIMIkrUYCVRvbGVyYW5jZbC1GAPItRgFSAOIAQE6Bpq1GAKFBkIRCg9fbWVhc3VyZWRfdmFsdWVCFQoTX21pbl9tZWFzdXJlZF92YWx1ZUIVChNfbWF4X21lYXN1cmVkX3ZhbHVlQgwKCl90b2xlcmFuY2UiuQMKFVBvd2VyU291cmNlUHJvcGVydGllcxJHChViYXRfcGVyY2VudF9yZW1haW5pbmcYASABKA1CI4i1GC+StRgTQmF0UGVyY2VudFJlbWFpbmluZ7C1GAzItRgFSACIAQESPQoQYmF0X2NoYXJnZV9sZXZlbBgCIAEoDUIeiLUYL5K1GA5CYXRDaGFyZ2VMZXZlbLC1GA7ItRgFSAGIAQESSQoWYmF0X3JlcGxhY2VtZW50X25lZWRlZBgDIAEoCEIkiLUYL5K1GBRCYXRSZXBsYWNlbWVudE5lZWRlZLC1GA/ItRgFSAKIAQESNAoLYmF0X3ZvbHRhZ2UYBCABKA1CGoi1GC+StRgKQmF0Vm9sdGFnZbC1GAvItRgFSAOIAQESKwoGc3RhdHVzGAUgASgNQhaItRgvkrUYBlN0YXR1c7C1GADItRgFSASIAQE6BZq1GAERQhgKFl9iYXRfcGVyY2VudF9yZW1haW5pbmdCEwoRX2JhdF9jaGFyZ2VfbGV2ZWxCGQoXX2JhdF9yZXBsYWNlbWVudF9uZWVkZWRCDgoMX2JhdF92b2x0YWdlQgkKB19zdGF0dXNCAkgBYgZwcm90bzM", [file_kusinta_iot_device_v1_matter_options]);
13
13
 
14
14
  /**
15
15
  * Describes the message kusinta.iot.device.v1.ThermostatProperties.
@@ -43,6 +43,11 @@ export declare const HomematicDeviceIdentitySchema: GenMessage<HomematicDeviceId
43
43
  * HomeMatic thermostat parameters with no Matter equivalent, carried on the same endpoint
44
44
  * as that thermostat's Matter properties rather than instead of them.
45
45
  *
46
+ * "No Matter equivalent" is the entry test, and it is the one to apply before adding a
47
+ * field here. Valve position failed it: LEVEL is Thermostat/PIHeatingDemand, and it lived
48
+ * here for a while under the claim that Matter had nothing for it. It is now
49
+ * device.v1.ThermostatProperties.pi_heating_demand, and field 6 is burned.
50
+ *
46
51
  * Battery state is deliberately NOT here. LOW_BAT and OPERATING_VOLTAGE are Matter's
47
52
  * PowerSource cluster, which every battery device from every technology needs, so they
48
53
  * belong on a Power Source endpoint. See device/v1/properties.proto.
@@ -52,6 +57,9 @@ export declare const HomematicDeviceIdentitySchema: GenMessage<HomematicDeviceId
52
57
  * false means not boosting, control_mode 0 is an HmIP ControlMode value. Absent means never
53
58
  * reported; present means a reading, including zero.
54
59
  *
60
+ * Enum parameters cross the wire as the CCU's own index, not as a type this schema defines,
61
+ * so each one lists its values in its comment. The order is the CCU's; do not renumber it.
62
+ *
55
63
  * Add new fields at the next available number — never reuse a removed one.
56
64
  *
57
65
  * @generated from message kusinta.iot.vendor.homematic.v1.HmThermostatProps
@@ -63,13 +71,17 @@ export declare type HmThermostatProps = Message<"kusinta.iot.vendor.homematic.v1
63
71
  boostMode?: boolean | undefined;
64
72
 
65
73
  /**
66
- * minutes remaining
74
+ * Minutes remaining, 0-2048. Integer on the CCU — it counts whole minutes.
67
75
  *
68
- * @generated from field: optional float boost_time_period = 2;
76
+ * @generated from field: optional uint32 boost_time_period = 2;
69
77
  */
70
78
  boostTimePeriod?: number | undefined;
71
79
 
72
80
  /**
81
+ * Write-only on the CCU: it accepts a ControlMode and never reports one back. Carried
82
+ * here for a future write path, not as a reading — a connector that emits it as a
83
+ * PropertyUpdate is sending a value the device never gave. 0-3.
84
+ *
73
85
  * @generated from field: optional uint32 control_mode = 3;
74
86
  */
75
87
  controlMode?: number | undefined;
@@ -80,28 +92,58 @@ export declare type HmThermostatProps = Message<"kusinta.iot.vendor.homematic.v1
80
92
  frostProtection?: boolean | undefined;
81
93
 
82
94
  /**
83
- * @generated from field: optional float current_profile_period = 5;
84
- */
85
- currentProfilePeriod?: number | undefined;
86
-
87
- /**
88
- * Valve position, 0.0-1.0 — how far the radiator valve is actually open. The reading
89
- * this extension exists for: it has no Matter equivalent, and it is what an automatic
90
- * or learned control strategy needs.
95
+ * Party mode active. A boolean, whatever the old field name suggested.
91
96
  *
92
- * @generated from field: optional float level = 6;
97
+ * @generated from field: optional bool party_mode = 5;
93
98
  */
94
- level?: number | undefined;
99
+ partyMode?: boolean | undefined;
95
100
 
96
101
  /**
102
+ * CLOSED = 0, OPEN = 1
103
+ *
97
104
  * @generated from field: optional uint32 window_state = 7;
98
105
  */
99
106
  windowState?: number | undefined;
100
107
 
101
108
  /**
109
+ * Valve fault and adaption state, nine CCU-defined values. Radiator valves only — a wall
110
+ * thermostat drives no valve and never reports it.
111
+ *
102
112
  * @generated from field: optional uint32 valve_state = 8;
103
113
  */
104
114
  valveState?: number | undefined;
115
+
116
+ /**
117
+ * Which schedule the thermostat is following: AUTO = 0, MANU = 1, AWAY = 2, plus a
118
+ * fourth CCU value. NOT webrtc.v1.SetpointAdjustMode, which names which setpoint a
119
+ * command targets — a different enum over a different set of concepts.
120
+ *
121
+ * @generated from field: optional uint32 set_point_mode = 9;
122
+ */
123
+ setPointMode?: number | undefined;
124
+
125
+ /**
126
+ * The active weekly profile: 1-3 on a radiator valve, 1-6 on a wall thermostat. The
127
+ * upper bound is the device's, not the protocol's.
128
+ *
129
+ * @generated from field: optional uint32 active_profile = 10;
130
+ */
131
+ activeProfile?: number | undefined;
132
+
133
+ /**
134
+ * Whether the measured temperature is usable: NORMAL = 0, UNKNOWN = 1, OVERFLOW = 2,
135
+ * UNDERFLOW = 3. A reading beside ACTUAL_TEMPERATURE, not a substitute for it.
136
+ *
137
+ * @generated from field: optional uint32 actual_temperature_status = 11;
138
+ */
139
+ actualTemperatureStatus?: number | undefined;
140
+
141
+ /**
142
+ * Valve adaption run: writing true starts the valve's stroke calibration.
143
+ *
144
+ * @generated from field: optional bool valve_adaption = 12;
145
+ */
146
+ valveAdaption?: boolean | undefined;
105
147
  };
106
148
 
107
149
  /**
@@ -110,3 +152,94 @@ export declare type HmThermostatProps = Message<"kusinta.iot.vendor.homematic.v1
110
152
  */
111
153
  export declare const HmThermostatPropsSchema: GenMessage<HmThermostatProps>;
112
154
 
155
+ /**
156
+ * The maintenance channel every HomeMatic device carries — device health and radio state,
157
+ * not what the device measures or controls.
158
+ *
159
+ * It is device-agnostic: a radiator valve, a wall thermostat and a switch actuator all
160
+ * report the same core set on the same channel, which is why this is one message rather
161
+ * than a per-device-type one. Which of these a given device actually has is model-
162
+ * dependent, and stated per device in device.v1.Endpoint.vendor_attribute_names — SABOTAGE
163
+ * especially, where "no tamper detected" and "cannot detect tamper" must not render alike.
164
+ *
165
+ * Not a Matter endpoint of its own: the maintenance channel is channel 0 upstream, and
166
+ * Matter reserves endpoint 0 for the root node. A connector puts these readings on the
167
+ * endpoint whose Matter properties they belong beside — the Power Source endpoint, whose
168
+ * battery attributes are derived from this same channel's LOW_BAT and OPERATING_VOLTAGE.
169
+ *
170
+ * LOW_BAT, OPERATING_VOLTAGE and OPERATING_VOLTAGE_LEVEL are deliberately absent: they are
171
+ * Matter's PowerSource cluster, and PowerSourceProperties carries them. Only the derived
172
+ * Matter value has a home there, so the raw OPERATING_VOLTAGE_STATUS enum is kept here.
173
+ *
174
+ * Every field is `optional`, for the reason HmThermostatProps gives: ERROR_CODE 0 is "no
175
+ * error", a reading, and SABOTAGE false is a safety claim.
176
+ *
177
+ * @generated from message kusinta.iot.vendor.homematic.v1.HmMaintenanceProps
178
+ */
179
+ export declare type HmMaintenanceProps = Message<"kusinta.iot.vendor.homematic.v1.HmMaintenanceProps"> & {
180
+ /**
181
+ * Device-defined fault code, 0-255, where 0 is no error. Present only on models that
182
+ * have one.
183
+ *
184
+ * @generated from field: optional uint32 error_code = 1;
185
+ */
186
+ errorCode?: number | undefined;
187
+
188
+ /**
189
+ * Tamper detection: true means the device reports having been removed or opened. Present
190
+ * only on models with the hardware for it.
191
+ *
192
+ * @generated from field: optional bool sabotage = 2;
193
+ */
194
+ sabotage?: boolean | undefined;
195
+
196
+ /**
197
+ * Received signal strength in dBm, -128 to 127, as this device measures it.
198
+ *
199
+ * sint32, not uint32: these are negative in normal operation, and an unsigned field would
200
+ * carry -72 dBm as 4294967224.
201
+ *
202
+ * @generated from field: optional sint32 rssi_device = 3;
203
+ */
204
+ rssiDevice?: number | undefined;
205
+
206
+ /**
207
+ * The same measurement made at the other end of the link, as reported back.
208
+ *
209
+ * @generated from field: optional sint32 rssi_peer = 4;
210
+ */
211
+ rssiPeer?: number | undefined;
212
+
213
+ /**
214
+ * Supply state as the CCU reports it: NORMAL = 0, UNKNOWN = 1, OVERFLOW = 2,
215
+ * EXTERNAL = 3. The raw enum; PowerSourceProperties.status carries the Matter
216
+ * PowerSourceStatusEnum value derived from it, and the two are not interchangeable.
217
+ *
218
+ * @generated from field: optional uint32 operating_voltage_status = 5;
219
+ */
220
+ operatingVoltageStatus?: number | undefined;
221
+
222
+ /**
223
+ * True when the gateway has lost contact with the device. Reachability as the upstream
224
+ * system sees it, which is not the same claim as device.v1.Device.last_seen — that is
225
+ * when the gateway last had evidence of the device, observed one hop further out.
226
+ *
227
+ * @generated from field: optional bool unreach = 6;
228
+ */
229
+ unreach?: boolean | undefined;
230
+
231
+ /**
232
+ * True while a configuration change is queued for a device that has not yet woken to
233
+ * take it. A battery device can sit here for its whole report interval.
234
+ *
235
+ * @generated from field: optional bool config_pending = 7;
236
+ */
237
+ configPending?: boolean | undefined;
238
+ };
239
+
240
+ /**
241
+ * Describes the message kusinta.iot.vendor.homematic.v1.HmMaintenanceProps.
242
+ * Use `create(HmMaintenancePropsSchema)` to create a new message.
243
+ */
244
+ export declare const HmMaintenancePropsSchema: GenMessage<HmMaintenanceProps>;
245
+
@@ -9,7 +9,7 @@ import { file_kusinta_iot_vendor_v1_vendor_options } from "../../v1/vendor_optio
9
9
  * Describes the file kusinta/iot/vendor/homematic/v1/homematic.proto.
10
10
  */
11
11
  export const file_kusinta_iot_vendor_homematic_v1_homematic = /*@__PURE__*/
12
- fileDesc("Ci9rdXNpbnRhL2lvdC92ZW5kb3IvaG9tZW1hdGljL3YxL2hvbWVtYXRpYy5wcm90bxIfa3VzaW50YS5pb3QudmVuZG9yLmhvbWVtYXRpYy52MSI4ChdIb21lbWF0aWNEZXZpY2VJZGVudGl0eRIPCgdhZGRyZXNzGAEgASgJEgwKBHR5cGUYAiABKAkipQQKEUhtVGhlcm1vc3RhdFByb3BzEicKCmJvb3N0X21vZGUYASABKAhCDqK1GApCT09TVF9NT0RFSACIAQESLgoRYm9vc3RfdGltZV9wZXJpb2QYAiABKAJCDqK1GApCT09TVF9USU1FSAGIAQESKwoMY29udHJvbF9tb2RlGAMgASgNQhCitRgMQ09OVFJPTF9NT0RFSAKIAQESMwoQZnJvc3RfcHJvdGVjdGlvbhgEIAEoCEIUorUYEEZST1NUX1BST1RFQ1RJT05IA4gBARIzChZjdXJyZW50X3Byb2ZpbGVfcGVyaW9kGAUgASgCQg6itRgKUEFSVFlfTU9ERUgEiAEBEh0KBWxldmVsGAYgASgCQgmitRgFTEVWRUxIBYgBARIrCgx3aW5kb3dfc3RhdGUYByABKA1CEKK1GAxXSU5ET1dfU1RBVEVIBogBARIpCgt2YWx2ZV9zdGF0ZRgIIAEoDUIPorUYC1ZBTFZFX1NUQVRFSAeIAQE6GKq1GBRob21lbWF0aWMudGhlcm1vc3RhdEINCgtfYm9vc3RfbW9kZUIUChJfYm9vc3RfdGltZV9wZXJpb2RCDwoNX2NvbnRyb2xfbW9kZUITChFfZnJvc3RfcHJvdGVjdGlvbkIZChdfY3VycmVudF9wcm9maWxlX3BlcmlvZEIICgZfbGV2ZWxCDwoNX3dpbmRvd19zdGF0ZUIOCgxfdmFsdmVfc3RhdGVCAkgBYgZwcm90bzM", [file_kusinta_iot_vendor_v1_vendor_options]);
12
+ fileDesc("Ci9rdXNpbnRhL2lvdC92ZW5kb3IvaG9tZW1hdGljL3YxL2hvbWVtYXRpYy5wcm90bxIfa3VzaW50YS5pb3QudmVuZG9yLmhvbWVtYXRpYy52MSI4ChdIb21lbWF0aWNEZXZpY2VJZGVudGl0eRIPCgdhZGRyZXNzGAEgASgJEgwKBHR5cGUYAiABKAki5gYKEUhtVGhlcm1vc3RhdFByb3BzEisKCmJvb3N0X21vZGUYASABKAhCEqK1GApCT09TVF9NT0RF0LUYBkgAiAEBEjIKEWJvb3N0X3RpbWVfcGVyaW9kGAIgASgNQhKitRgKQk9PU1RfVElNRdC1GAVIAYgBARIvCgxjb250cm9sX21vZGUYAyABKA1CFKK1GAxDT05UUk9MX01PREXQtRgCSAKIAQESNwoQZnJvc3RfcHJvdGVjdGlvbhgEIAEoCEIYorUYEEZST1NUX1BST1RFQ1RJT07QtRgFSAOIAQESKwoKcGFydHlfbW9kZRgFIAEoCEISorUYClBBUlRZX01PREXQtRgFSASIAQESLwoMd2luZG93X3N0YXRlGAcgASgNQhSitRgMV0lORE9XX1NUQVRF0LUYB0gFiAEBEi0KC3ZhbHZlX3N0YXRlGAggASgNQhOitRgLVkFMVkVfU1RBVEXQtRgFSAaIAQESMwoOc2V0X3BvaW50X21vZGUYCSABKA1CFqK1GA5TRVRfUE9JTlRfTU9ERdC1GAdIB4gBARIzCg5hY3RpdmVfcHJvZmlsZRgKIAEoDUIWorUYDkFDVElWRV9QUk9GSUxF0LUYB0gIiAEBEkkKGWFjdHVhbF90ZW1wZXJhdHVyZV9zdGF0dXMYCyABKA1CIaK1GBlBQ1RVQUxfVEVNUEVSQVRVUkVfU1RBVFVT0LUYBUgJiAEBEjMKDnZhbHZlX2FkYXB0aW9uGAwgASgIQhaitRgOVkFMVkVfQURBUFRJT07QtRgHSAqIAQE6GKq1GBRob21lbWF0aWMudGhlcm1vc3RhdEINCgtfYm9vc3RfbW9kZUIUChJfYm9vc3RfdGltZV9wZXJpb2RCDwoNX2NvbnRyb2xfbW9kZUITChFfZnJvc3RfcHJvdGVjdGlvbkINCgtfcGFydHlfbW9kZUIPCg1fd2luZG93X3N0YXRlQg4KDF92YWx2ZV9zdGF0ZUIRCg9fc2V0X3BvaW50X21vZGVCEQoPX2FjdGl2ZV9wcm9maWxlQhwKGl9hY3R1YWxfdGVtcGVyYXR1cmVfc3RhdHVzQhEKD192YWx2ZV9hZGFwdGlvbkoECAYQB1IFbGV2ZWxSFmN1cnJlbnRfcHJvZmlsZV9wZXJpb2Qi+gMKEkhtTWFpbnRlbmFuY2VQcm9wcxIrCgplcnJvcl9jb2RlGAEgASgNQhKitRgKRVJST1JfQ09ERdC1GAVIAIgBARInCghzYWJvdGFnZRgCIAEoCEIQorUYCFNBQk9UQUdF0LUYBUgBiAEBEi0KC3Jzc2lfZGV2aWNlGAMgASgRQhOitRgLUlNTSV9ERVZJQ0XQtRgFSAKIAQESKQoJcnNzaV9wZWVyGAQgASgRQhGitRgJUlNTSV9QRUVS0LUYBUgDiAEBEkcKGG9wZXJhdGluZ192b2x0YWdlX3N0YXR1cxgFIAEoDUIgorUYGE9QRVJBVElOR19WT0xUQUdFX1NUQVRVU9C1GAVIBIgBARIlCgd1bnJlYWNoGAYgASgIQg+itRgHVU5SRUFDSNC1GAVIBYgBARIzCg5jb25maWdfcGVuZGluZxgHIAEoCEIWorUYDkNPTkZJR19QRU5ESU5H0LUYBUgGiAEBOhmqtRgVaG9tZW1hdGljLm1haW50ZW5hbmNlQg0KC19lcnJvcl9jb2RlQgsKCV9zYWJvdGFnZUIOCgxfcnNzaV9kZXZpY2VCDAoKX3Jzc2lfcGVlckIbChlfb3BlcmF0aW5nX3ZvbHRhZ2Vfc3RhdHVzQgoKCF91bnJlYWNoQhEKD19jb25maWdfcGVuZGluZ0ICSAFiBnByb3RvMw", [file_kusinta_iot_vendor_v1_vendor_options]);
13
13
 
14
14
  /**
15
15
  * Describes the message kusinta.iot.vendor.homematic.v1.HomematicDeviceIdentity.
@@ -25,3 +25,10 @@ export const HomematicDeviceIdentitySchema = /*@__PURE__*/
25
25
  export const HmThermostatPropsSchema = /*@__PURE__*/
26
26
  messageDesc(file_kusinta_iot_vendor_homematic_v1_homematic, 1);
27
27
 
28
+ /**
29
+ * Describes the message kusinta.iot.vendor.homematic.v1.HmMaintenanceProps.
30
+ * Use `create(HmMaintenancePropsSchema)` to create a new message.
31
+ */
32
+ export const HmMaintenancePropsSchema = /*@__PURE__*/
33
+ messageDesc(file_kusinta_iot_vendor_homematic_v1_homematic, 2);
34
+
@@ -26,6 +26,27 @@ export declare const file_kusinta_iot_vendor_v1_vendor_options: GenFile;
26
26
  */
27
27
  export declare const vendor_attribute: GenExtension<FieldOptions, string>;
28
28
 
29
+ /**
30
+ * What this vendor parameter supports, as the same bitmask device/v1/matter_options.proto
31
+ * defines: READ = 1, WRITE = 2, REPORT = 4.
32
+ *
33
+ * One mask across both branches on purpose. Bit 4 is Matter's reportable quality and, for
34
+ * HomeMatic, the parameter's EVENT bit — the same fact under two names, so a consumer
35
+ * deciding whether to draw a control or a reading asks one question either way.
36
+ *
37
+ * Where the value comes from is the difference. The Matter side reads its mask off the
38
+ * specification; a vendor parameter has no spec to defer to, so this is the upstream
39
+ * system's own answer about its own parameter — for HomeMatic, the OPERATIONS value the
40
+ * CCU reports in getParamsetDescription().
41
+ *
42
+ * Not permission, and not the implemented set: see matter_attribute_capabilities for both
43
+ * distinctions. The vendor mirror of the implemented set is
44
+ * device.v1.Endpoint.vendor_attribute_names.
45
+ *
46
+ * @generated from extension: uint32 vendor_attribute_capabilities = 50010;
47
+ */
48
+ export declare const vendor_attribute_capabilities: GenExtension<FieldOptions, number>;
49
+
29
50
  /**
30
51
  * The stable key identifying a vendor extension message, e.g. "homematic.thermostat".
31
52
  * Matches device.v1.PropertyUpdate.vendor_extension byte for byte, and is what selects
@@ -9,7 +9,7 @@ import { file_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt";
9
9
  * Describes the file kusinta/iot/vendor/v1/vendor_options.proto.
10
10
  */
11
11
  export const file_kusinta_iot_vendor_v1_vendor_options = /*@__PURE__*/
12
- fileDesc("CiprdXNpbnRhL2lvdC92ZW5kb3IvdjEvdmVuZG9yX29wdGlvbnMucHJvdG8SFWt1c2ludGEuaW90LnZlbmRvci52MTpKChB2ZW5kb3JfYXR0cmlidXRlEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjUhgMgASgJUg92ZW5kb3JBdHRyaWJ1dGU6TAoQdmVuZG9yX2V4dGVuc2lvbhIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjVhgMgASgJUg92ZW5kb3JFeHRlbnNpb25iBnByb3RvMw", [file_google_protobuf_descriptor]);
12
+ fileDesc("CiprdXNpbnRhL2lvdC92ZW5kb3IvdjEvdmVuZG9yX29wdGlvbnMucHJvdG8SFWt1c2ludGEuaW90LnZlbmRvci52MTpKChB2ZW5kb3JfYXR0cmlidXRlEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjUhgMgASgJUg92ZW5kb3JBdHRyaWJ1dGU6YwoddmVuZG9yX2F0dHJpYnV0ZV9jYXBhYmlsaXRpZXMSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGNqGAyABKA1SG3ZlbmRvckF0dHJpYnV0ZUNhcGFiaWxpdGllczpMChB2ZW5kb3JfZXh0ZW5zaW9uEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGNWGAyABKAlSD3ZlbmRvckV4dGVuc2lvbmIGcHJvdG8z", [file_google_protobuf_descriptor]);
13
13
 
14
14
  /**
15
15
  * The vendor parameter this field carries, in the vendor's own spelling — e.g.
@@ -28,6 +28,28 @@ export const file_kusinta_iot_vendor_v1_vendor_options = /*@__PURE__*/
28
28
  export const vendor_attribute = /*@__PURE__*/
29
29
  extDesc(file_kusinta_iot_vendor_v1_vendor_options, 0);
30
30
 
31
+ /**
32
+ * What this vendor parameter supports, as the same bitmask device/v1/matter_options.proto
33
+ * defines: READ = 1, WRITE = 2, REPORT = 4.
34
+ *
35
+ * One mask across both branches on purpose. Bit 4 is Matter's reportable quality and, for
36
+ * HomeMatic, the parameter's EVENT bit — the same fact under two names, so a consumer
37
+ * deciding whether to draw a control or a reading asks one question either way.
38
+ *
39
+ * Where the value comes from is the difference. The Matter side reads its mask off the
40
+ * specification; a vendor parameter has no spec to defer to, so this is the upstream
41
+ * system's own answer about its own parameter — for HomeMatic, the OPERATIONS value the
42
+ * CCU reports in getParamsetDescription().
43
+ *
44
+ * Not permission, and not the implemented set: see matter_attribute_capabilities for both
45
+ * distinctions. The vendor mirror of the implemented set is
46
+ * device.v1.Endpoint.vendor_attribute_names.
47
+ *
48
+ * @generated from extension: uint32 vendor_attribute_capabilities = 50010;
49
+ */
50
+ export const vendor_attribute_capabilities = /*@__PURE__*/
51
+ extDesc(file_kusinta_iot_vendor_v1_vendor_options, 1);
52
+
31
53
  /**
32
54
  * The stable key identifying a vendor extension message, e.g. "homematic.thermostat".
33
55
  * Matches device.v1.PropertyUpdate.vendor_extension byte for byte, and is what selects
@@ -49,5 +71,5 @@ export const vendor_attribute = /*@__PURE__*/
49
71
  * @generated from extension: string vendor_extension = 50005;
50
72
  */
51
73
  export const vendor_extension = /*@__PURE__*/
52
- extDesc(file_kusinta_iot_vendor_v1_vendor_options, 1);
74
+ extDesc(file_kusinta_iot_vendor_v1_vendor_options, 2);
53
75
 
@@ -4,6 +4,7 @@
4
4
 
5
5
  import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
+ import type { SetpointAdjustMode } from "./setpoint_mode_pb.js";
7
8
  import type { DeviceId } from "../../identity/v1/identity_pb.js";
8
9
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
9
10
  import type { AttributeRef } from "../../access/v1/acl_pb.js";
@@ -28,11 +29,11 @@ export declare const file_kusinta_iot_webrtc_v1_command: GenFile;
28
29
  */
29
30
  export declare type ThermostatSetpointParams = Message<"kusinta.iot.webrtc.v1.ThermostatSetpointParams"> & {
30
31
  /**
31
- * SetpointAdjustMode, see above
32
+ * absent = the producer stated no mode
32
33
  *
33
- * @generated from field: optional uint32 mode = 1;
34
+ * @generated from field: optional kusinta.iot.webrtc.v1.SetpointAdjustMode mode = 1;
34
35
  */
35
- mode?: number | undefined;
36
+ mode?: SetpointAdjustMode | undefined;
36
37
 
37
38
  /**
38
39
  * centidegrees delta
@@ -8,12 +8,13 @@ import { file_kusinta_iot_access_v1_acl } from "../../access/v1/acl_pb.js";
8
8
  import { file_kusinta_iot_device_v1_cluster_state } from "../../device/v1/cluster_state_pb.js";
9
9
  import { file_kusinta_iot_device_v1_matter_options } from "../../device/v1/matter_options_pb.js";
10
10
  import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
11
+ import { file_kusinta_iot_webrtc_v1_setpoint_mode } from "./setpoint_mode_pb.js";
11
12
 
12
13
  /**
13
14
  * Describes the file kusinta/iot/webrtc/v1/command.proto.
14
15
  */
15
16
  export const file_kusinta_iot_webrtc_v1_command = /*@__PURE__*/
16
- fileDesc("CiNrdXNpbnRhL2lvdC93ZWJydGMvdjEvY29tbWFuZC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxIlEKGFRoZXJtb3N0YXRTZXRwb2ludFBhcmFtcxIRCgRtb2RlGAEgASgNSACIAQESDgoGYW1vdW50GAIgASgROgm4tRiBBMC1GABCBwoFX21vZGUiRgoSTGV2ZWxDb250cm9sUGFyYW1zEg0KBWxldmVsGAEgASgNEhcKD3RyYW5zaXRpb25fdGltZRgCIAEoDToIuLUYCMC1GAAiKwoLT25PZmZQYXJhbXM6BLi1GAZKBAgBEAJKBAgCEANSAm9uUgZ0b2dnbGUiQQoYV2luZG93Q292ZXJpbmdMaWZ0UGFyYW1zEhoKEmxpZnRfcGVyY2VudDEwMHRocxgBIAEoDToJuLUYggLAtRgFIjsKDkRvb3JMb2NrUGFyYW1zEhAKCHBpbl9jb2RlGAIgASgJOgW4tRiBAkoECAEQAlIKbG9ja19zdGF0ZSKSBQoNRGV2aWNlQ29tbWFuZBISCgpyZXF1ZXN0X2lkGAEgASgJEjQKCWRldmljZV9pZBgCIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEhQKDGNvbW1hbmRfbmFtZRgEIAEoCRISCgpjbHVzdGVyX2lkGAwgASgNEh4KEW1hdHRlcl9jb21tYW5kX2lkGA0gASgNSAGIAQESGAoLZW5kcG9pbnRfaWQYCyABKA1IAogBARJOChN0aGVybW9zdGF0X3NldHBvaW50GAUgASgLMi8ua3VzaW50YS5pb3Qud2VicnRjLnYxLlRoZXJtb3N0YXRTZXRwb2ludFBhcmFtc0gAEkIKDWxldmVsX2NvbnRyb2wYBiABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGV2ZWxDb250cm9sUGFyYW1zSAASNAoGb25fb2ZmGAcgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLk9uT2ZmUGFyYW1zSAASTwoUd2luZG93X2NvdmVyaW5nX2xpZnQYCCABKAsyLy5rdXNpbnRhLmlvdC53ZWJydGMudjEuV2luZG93Q292ZXJpbmdMaWZ0UGFyYW1zSAASOgoJZG9vcl9sb2NrGAkgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLkRvb3JMb2NrUGFyYW1zSAASEQoHcmF3X3RsdhhjIAEoDEgAQgwKCnBhcmFtZXRlcnNCFAoSX21hdHRlcl9jb21tYW5kX2lkQg4KDF9lbmRwb2ludF9pZEoECAMQBEoECAoQC1IOY2x1c3Rlcl9pZF9oZXhSGXRoZXJtb3N0YXRfc2V0cG9pbnRfd3JpdGUiXAoMQ29tbWFuZEVycm9yEg8KB21lc3NhZ2UYAiABKAkSNQoEY29kZRgDIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kRXJyb3JDb2RlSgQIARACIt4BCg1Db21tYW5kUmVzdWx0EhIKCnJlcXVlc3RfaWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIyCgVlcnJvchgDIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kRXJyb3ISMAoMY29tcGxldGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIzCgpzZXR0bGVzX2J5GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBQg0KC19zZXR0bGVzX2J5IswBChVBdHRyaWJ1dGVXcml0ZVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYAyABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEjQKBXZhbHVlGAQgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlKr8CChBDb21tYW5kRXJyb3JDb2RlEiIKHkNPTU1BTkRfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEiMKH0NPTU1BTkRfRVJST1JfQ09ERV9OT1RfRU5USVRMRUQQARIqCiZDT01NQU5EX0VSUk9SX0NPREVfQ09OU1RSQUlOVF9WSU9MQVRFRBACEiYKIkNPTU1BTkRfRVJST1JfQ09ERV9JTlZBTElEX0NPTU1BTkQQAxIiCh5DT01NQU5EX0VSUk9SX0NPREVfVU5SRUFDSEFCTEUQBBIeChpDT01NQU5EX0VSUk9SX0NPREVfVElNRU9VVBAFEikKJUNPTU1BTkRfRVJST1JfQ09ERV9SRUpFQ1RFRF9CWV9ERVZJQ0UQBhIfChtDT01NQU5EX0VSUk9SX0NPREVfSU5URVJOQUwQB0ICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_matter_options, file_kusinta_iot_identity_v1_identity]);
17
+ fileDesc("CiNrdXNpbnRhL2lvdC93ZWJydGMvdjEvY29tbWFuZC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxInwKGFRoZXJtb3N0YXRTZXRwb2ludFBhcmFtcxI8CgRtb2RlGAEgASgOMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldHBvaW50QWRqdXN0TW9kZUgAiAEBEg4KBmFtb3VudBgCIAEoEToJuLUYgQTAtRgAQgcKBV9tb2RlIkYKEkxldmVsQ29udHJvbFBhcmFtcxINCgVsZXZlbBgBIAEoDRIXCg90cmFuc2l0aW9uX3RpbWUYAiABKA06CLi1GAjAtRgAIisKC09uT2ZmUGFyYW1zOgS4tRgGSgQIARACSgQIAhADUgJvblIGdG9nZ2xlIkEKGFdpbmRvd0NvdmVyaW5nTGlmdFBhcmFtcxIaChJsaWZ0X3BlcmNlbnQxMDB0aHMYASABKA06Cbi1GIICwLUYBSI7Cg5Eb29yTG9ja1BhcmFtcxIQCghwaW5fY29kZRgCIAEoCToFuLUYgQJKBAgBEAJSCmxvY2tfc3RhdGUikgUKDURldmljZUNvbW1hbmQSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIUCgxjb21tYW5kX25hbWUYBCABKAkSEgoKY2x1c3Rlcl9pZBgMIAEoDRIeChFtYXR0ZXJfY29tbWFuZF9pZBgNIAEoDUgBiAEBEhgKC2VuZHBvaW50X2lkGAsgASgNSAKIAQESTgoTdGhlcm1vc3RhdF9zZXRwb2ludBgFIAEoCzIvLmt1c2ludGEuaW90LndlYnJ0Yy52MS5UaGVybW9zdGF0U2V0cG9pbnRQYXJhbXNIABJCCg1sZXZlbF9jb250cm9sGAYgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkxldmVsQ29udHJvbFBhcmFtc0gAEjQKBm9uX29mZhgHIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Pbk9mZlBhcmFtc0gAEk8KFHdpbmRvd19jb3ZlcmluZ19saWZ0GAggASgLMi8ua3VzaW50YS5pb3Qud2VicnRjLnYxLldpbmRvd0NvdmVyaW5nTGlmdFBhcmFtc0gAEjoKCWRvb3JfbG9jaxgJIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Eb29yTG9ja1BhcmFtc0gAEhEKB3Jhd190bHYYYyABKAxIAEIMCgpwYXJhbWV0ZXJzQhQKEl9tYXR0ZXJfY29tbWFuZF9pZEIOCgxfZW5kcG9pbnRfaWRKBAgDEARKBAgKEAtSDmNsdXN0ZXJfaWRfaGV4Uhl0aGVybW9zdGF0X3NldHBvaW50X3dyaXRlIlwKDENvbW1hbmRFcnJvchIPCgdtZXNzYWdlGAIgASgJEjUKBGNvZGUYAyABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yQ29kZUoECAEQAiLeAQoNQ29tbWFuZFJlc3VsdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMgoFZXJyb3IYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yEjAKDGNvbXBsZXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMwoKc2V0dGxlc19ieRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfc2V0dGxlc19ieSLMAQoVQXR0cmlidXRlV3JpdGVSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSNAoJZGV2aWNlX2lkGAIgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSMwoGdGFyZ2V0GAMgASgLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhI0CgV2YWx1ZRgEIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZSq/AgoQQ29tbWFuZEVycm9yQ29kZRIiCh5DT01NQU5EX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIjCh9DT01NQU5EX0VSUk9SX0NPREVfTk9UX0VOVElUTEVEEAESKgomQ09NTUFORF9FUlJPUl9DT0RFX0NPTlNUUkFJTlRfVklPTEFURUQQAhImCiJDT01NQU5EX0VSUk9SX0NPREVfSU5WQUxJRF9DT01NQU5EEAMSIgoeQ09NTUFORF9FUlJPUl9DT0RFX1VOUkVBQ0hBQkxFEAQSHgoaQ09NTUFORF9FUlJPUl9DT0RFX1RJTUVPVVQQBRIpCiVDT01NQU5EX0VSUk9SX0NPREVfUkVKRUNURURfQllfREVWSUNFEAYSHwobQ09NTUFORF9FUlJPUl9DT0RFX0lOVEVSTkFMEAdCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_matter_options, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_webrtc_v1_setpoint_mode]);
17
18
 
18
19
  /**
19
20
  * Describes the message kusinta.iot.webrtc.v1.ThermostatSetpointParams.
@@ -0,0 +1,63 @@
1
+ // @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
2
+ // @generated from file kusinta/iot/webrtc/v1/setpoint_mode.proto (package kusinta.iot.webrtc.v1, syntax proto3)
3
+ /* eslint-disable */
4
+
5
+ import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv2";
6
+
7
+ /**
8
+ * Describes the file kusinta/iot/webrtc/v1/setpoint_mode.proto.
9
+ */
10
+ export declare const file_kusinta_iot_webrtc_v1_setpoint_mode: GenFile;
11
+
12
+ /**
13
+ * SetpointAdjustMode selects which setpoint a thermostat command targets. It is
14
+ * Matter's SetpointRaiseLowerModeEnum (Thermostat cluster 0x0201) and carries Matter's
15
+ * own numbering.
16
+ *
17
+ * A real type rather than a numbering written down in a comment. The mode field on
18
+ * ThermostatSetpointParams was a bare uint32 with this numbering stated beside it, so a
19
+ * consumer carrying forward an older Heat=1/Cool=2/Both=3 convention compiled cleanly and
20
+ * silently reversed which physical behavior a command produced.
21
+ *
22
+ * Zero is a real mode, not a "not set" sentinel — which is why there is no
23
+ * SETPOINT_ADJUST_MODE_UNSPECIFIED, and why every field carrying this value has explicit
24
+ * presence: absent = the producer stated no mode, present = the mode it named, Heat
25
+ * included. This is the same rule properties.proto applies to readings, for the same
26
+ * reason — a bare proto3 scalar makes "meant Heat" and "never set it" identical on the
27
+ * wire. Renumbering to free zero is not available: the wire value IS Matter's value.
28
+ *
29
+ * SetpointAdjustMode is NOT ThermostatProperties.system_mode. system_mode is Matter's
30
+ * SystemModeEnum (Off=0, Auto=1, Cool=3, Heat=4), a different enum over a different set
31
+ * of concepts. Cool is 1 here and 3 there; the two must never be substituted for each
32
+ * other or read through the same mapping table.
33
+ *
34
+ * @generated from enum kusinta.iot.webrtc.v1.SetpointAdjustMode
35
+ */
36
+ export enum SetpointAdjustMode {
37
+ /**
38
+ * Targets ThermostatProperties.occupied_heating_setpoint.
39
+ *
40
+ * @generated from enum value: SETPOINT_ADJUST_MODE_HEAT = 0;
41
+ */
42
+ HEAT = 0,
43
+
44
+ /**
45
+ * Targets ThermostatProperties.occupied_cooling_setpoint.
46
+ *
47
+ * @generated from enum value: SETPOINT_ADJUST_MODE_COOL = 1;
48
+ */
49
+ COOL = 1,
50
+
51
+ /**
52
+ * Targets both setpoints.
53
+ *
54
+ * @generated from enum value: SETPOINT_ADJUST_MODE_BOTH = 2;
55
+ */
56
+ BOTH = 2,
57
+ }
58
+
59
+ /**
60
+ * Describes the enum kusinta.iot.webrtc.v1.SetpointAdjustMode.
61
+ */
62
+ export declare const SetpointAdjustModeSchema: GenEnum<SetpointAdjustMode>;
63
+
@@ -0,0 +1,45 @@
1
+ // @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
2
+ // @generated from file kusinta/iot/webrtc/v1/setpoint_mode.proto (package kusinta.iot.webrtc.v1, syntax proto3)
3
+ /* eslint-disable */
4
+
5
+ import { enumDesc, fileDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
+
7
+ /**
8
+ * Describes the file kusinta/iot/webrtc/v1/setpoint_mode.proto.
9
+ */
10
+ export const file_kusinta_iot_webrtc_v1_setpoint_mode = /*@__PURE__*/
11
+ fileDesc("CilrdXNpbnRhL2lvdC93ZWJydGMvdjEvc2V0cG9pbnRfbW9kZS5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxKnEKElNldHBvaW50QWRqdXN0TW9kZRIdChlTRVRQT0lOVF9BREpVU1RfTU9ERV9IRUFUEAASHQoZU0VUUE9JTlRfQURKVVNUX01PREVfQ09PTBABEh0KGVNFVFBPSU5UX0FESlVTVF9NT0RFX0JPVEgQAkICSAFiBnByb3RvMw");
12
+
13
+ /**
14
+ * Describes the enum kusinta.iot.webrtc.v1.SetpointAdjustMode.
15
+ */
16
+ export const SetpointAdjustModeSchema = /*@__PURE__*/
17
+ enumDesc(file_kusinta_iot_webrtc_v1_setpoint_mode, 0);
18
+
19
+ /**
20
+ * SetpointAdjustMode selects which setpoint a thermostat command targets. It is
21
+ * Matter's SetpointRaiseLowerModeEnum (Thermostat cluster 0x0201) and carries Matter's
22
+ * own numbering.
23
+ *
24
+ * A real type rather than a numbering written down in a comment. The mode field on
25
+ * ThermostatSetpointParams was a bare uint32 with this numbering stated beside it, so a
26
+ * consumer carrying forward an older Heat=1/Cool=2/Both=3 convention compiled cleanly and
27
+ * silently reversed which physical behavior a command produced.
28
+ *
29
+ * Zero is a real mode, not a "not set" sentinel — which is why there is no
30
+ * SETPOINT_ADJUST_MODE_UNSPECIFIED, and why every field carrying this value has explicit
31
+ * presence: absent = the producer stated no mode, present = the mode it named, Heat
32
+ * included. This is the same rule properties.proto applies to readings, for the same
33
+ * reason — a bare proto3 scalar makes "meant Heat" and "never set it" identical on the
34
+ * wire. Renumbering to free zero is not available: the wire value IS Matter's value.
35
+ *
36
+ * SetpointAdjustMode is NOT ThermostatProperties.system_mode. system_mode is Matter's
37
+ * SystemModeEnum (Off=0, Auto=1, Cool=3, Heat=4), a different enum over a different set
38
+ * of concepts. Cool is 1 here and 3 there; the two must never be substituted for each
39
+ * other or read through the same mapping table.
40
+ *
41
+ * @generated from enum kusinta.iot.webrtc.v1.SetpointAdjustMode
42
+ */
43
+ export const SetpointAdjustMode = /*@__PURE__*/
44
+ tsEnum(SetpointAdjustModeSchema);
45
+