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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kusinta/iot-schema",
3
- "version": "0.2.0-beta.35",
3
+ "version": "0.2.0-beta.36",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -207,9 +207,63 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
207
207
  * the sensors service may see are still sent, since setting a room up is service work.
208
208
  * Its climate over time is available to service only as an ApartmentClimateSummary.
209
209
  *
210
+ * explanations, target_held_until, planning and the comfort band are withheld in the
211
+ * same way.
212
+ *
210
213
  * @generated from field: bool state_withheld = 15;
211
214
  */
212
215
  stateWithheld: boolean;
216
+
217
+ /**
218
+ * Why the room is being held where it is, when that differs from simply holding its
219
+ * target: a plan heating ahead of an expensive hour, the heat source busy with hot water,
220
+ * a floor zone held back. Most significant first. An app that shows one shows the first
221
+ * it can show: a kind and subject it knows, a pair that kind lists, and not past its
222
+ * ends_at. Empty: nothing beyond the target and condition needs explaining.
223
+ *
224
+ * A window, a lost sensor and the rest of RoomClimateCondition are told by condition and
225
+ * never repeated here; a target a person set is told by target_change and
226
+ * target_held_until; whether the room is planned for at all is told by planning — one
227
+ * fact, one place.
228
+ *
229
+ * Sent with the room, so a replaced room replaces its list: an explanation absent from
230
+ * the latest RoomClimate no longer holds.
231
+ *
232
+ * @generated from field: repeated kusinta.iot.climate.v1.ClimateExplanation explanations = 16;
233
+ */
234
+ explanations: ClimateExplanation[];
235
+
236
+ /**
237
+ * When a target a person set will next be moved by the gateway on its own — a schedule
238
+ * step, a plan taking over again. Unset: it holds until somebody changes it. Told so that
239
+ * a person is not surprised when their change ends. Unset whenever target_change is
240
+ * withheld from the recipient, for the same reasons: it describes the same change.
241
+ *
242
+ * @generated from field: google.protobuf.Timestamp target_held_until = 17;
243
+ */
244
+ targetHeldUntil?: Timestamp | undefined;
245
+
246
+ /**
247
+ * Whether a plan steers the room. See RoomPlanning.
248
+ *
249
+ * @generated from field: kusinta.iot.climate.v1.RoomPlanning planning = 18;
250
+ */
251
+ planning: RoomPlanning;
252
+
253
+ /**
254
+ * The comfort band in force, in centidegrees: the lowest and highest a plan may hold the
255
+ * room at while it heats ahead, coasts or saves on dear energy. Both set or neither, low
256
+ * no higher than high, and within [min_centidegrees, max_centidegrees] where those are
257
+ * set. Absent: no band, and a plan holds the room at its target — never 0 °C.
258
+ *
259
+ * @generated from field: optional sint32 comfort_band_low_centidegrees = 19;
260
+ */
261
+ comfortBandLowCentidegrees?: number | undefined;
262
+
263
+ /**
264
+ * @generated from field: optional sint32 comfort_band_high_centidegrees = 20;
265
+ */
266
+ comfortBandHighCentidegrees?: number | undefined;
213
267
  };
214
268
 
215
269
  /**
@@ -218,6 +272,45 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
218
272
  */
219
273
  export declare const RoomClimateSchema: GenMessage<RoomClimate>;
220
274
 
275
+ /**
276
+ * One reason a room, or a part of its heating, is where it is.
277
+ *
278
+ * @generated from message kusinta.iot.climate.v1.ClimateExplanation
279
+ */
280
+ export declare type ClimateExplanation = Message<"kusinta.iot.climate.v1.ClimateExplanation"> & {
281
+ /**
282
+ * @generated from field: kusinta.iot.climate.v1.ClimateExplanationKind kind = 1;
283
+ */
284
+ kind: ClimateExplanationKind;
285
+
286
+ /**
287
+ * What the cause acts on. The gateway always sets it. An app shows nothing for an
288
+ * explanation whose subject is unspecified or unknown to it, rather than presenting it
289
+ * as the room's.
290
+ *
291
+ * @generated from field: kusinta.iot.climate.v1.ClimateExplanationSubject subject = 2;
292
+ */
293
+ subject: ClimateExplanationSubject;
294
+
295
+ /**
296
+ * When the explanation stops holding. Unset: while the room's latest RoomClimate carries
297
+ * it. An app MUST NOT show an explanation past its ends_at, also while it cannot reach
298
+ * the gateway, and while it cannot reach the gateway it shows none without an ends_at:
299
+ * an explanation that outlives its window is a claim about the room nobody is making any
300
+ * more. An explanation that holds because of a leased write ends no later than that
301
+ * lease, after which the output is back at its lapse value whatever the gateway does.
302
+ *
303
+ * @generated from field: google.protobuf.Timestamp ends_at = 3;
304
+ */
305
+ endsAt?: Timestamp | undefined;
306
+ };
307
+
308
+ /**
309
+ * Describes the message kusinta.iot.climate.v1.ClimateExplanation.
310
+ * Use `create(ClimateExplanationSchema)` to create a new message.
311
+ */
312
+ export declare const ClimateExplanationSchema: GenMessage<ClimateExplanation>;
313
+
221
314
  /**
222
315
  * A mode on a home ends when whoever switched it on stops being one of its residents: a new
223
316
  * tenant does not inherit the previous one's holiday. A mode on a room ends when the room
@@ -619,6 +712,217 @@ export enum RoomClimateCondition {
619
712
  */
620
713
  export declare const RoomClimateConditionSchema: GenEnum<RoomClimateCondition>;
621
714
 
715
+ /**
716
+ * Whether a plan steers a room: one that looks ahead at prices, weather and the heat
717
+ * source and moves the room within its comfort band. A standing state of the room, not a
718
+ * reason, so it is a field of its own rather than an explanation.
719
+ *
720
+ * @generated from enum kusinta.iot.climate.v1.RoomPlanning
721
+ */
722
+ export enum RoomPlanning {
723
+ /**
724
+ * Not stated.
725
+ *
726
+ * @generated from enum value: ROOM_PLANNING_UNSPECIFIED = 0;
727
+ */
728
+ UNSPECIFIED = 0,
729
+
730
+ /**
731
+ * A plan steers the room. Its explanations say what it is doing.
732
+ *
733
+ * @generated from enum value: ROOM_PLANNING_PLANNED = 1;
734
+ */
735
+ PLANNED = 1,
736
+
737
+ /**
738
+ * No plan steers the room: planning is switched off for it, or was never set up. The
739
+ * room follows its target and schedule.
740
+ *
741
+ * @generated from enum value: ROOM_PLANNING_NOT_PLANNED = 2;
742
+ */
743
+ NOT_PLANNED = 2,
744
+
745
+ /**
746
+ * A plan would steer the room but cannot be made — prices or a forecast are missing —
747
+ * so the room follows its target and schedule until one can.
748
+ *
749
+ * @generated from enum value: ROOM_PLANNING_UNAVAILABLE = 3;
750
+ */
751
+ UNAVAILABLE = 3,
752
+ }
753
+
754
+ /**
755
+ * Describes the enum kusinta.iot.climate.v1.RoomPlanning.
756
+ */
757
+ export declare const RoomPlanningSchema: GenEnum<RoomPlanning>;
758
+
759
+ /**
760
+ * What held a room, or a part of its heating, where it is. A closed list of causes: the
761
+ * gateway sends a kind, never a sentence, and the app names each kind in its user's
762
+ * language. What the cause acts on is ClimateExplanation.subject, and each kind lists the
763
+ * subjects it may carry. A pair a kind does not list is shown as nothing, so a pair added
764
+ * later reaches an older app as nothing rather than as a guess.
765
+ *
766
+ * No kind identifies another household or anything about one, its activity included.
767
+ * Where a limit is shared — a building's power, a shared heat source — the explanation
768
+ * says that this room was limited, never by whom or because of whom. A kind that a source
769
+ * or limit shared with other homes drives — HOT_WATER_PRIORITY on a shared heat source,
770
+ * SHARED_POWER_BUDGET, DISTRICT_HEATING_PEAK on a shared connection — is sent only where at
771
+ * least three homes share that source or limit, in rooms in homes and outside them alike.
772
+ * Below that, its onset and end would track another home's use as it happens, and the
773
+ * room carries no explanation for it.
774
+ *
775
+ * @generated from enum kusinta.iot.climate.v1.ClimateExplanationKind
776
+ */
777
+ export enum ClimateExplanationKind {
778
+ /**
779
+ * Sender did not set a kind, or sent one this client's schema does not know. An app
780
+ * shows nothing for it rather than guessing.
781
+ *
782
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_UNSPECIFIED = 0;
783
+ */
784
+ UNSPECIFIED = 0,
785
+
786
+ /**
787
+ * Heated ahead of a dearer or colder period, within the comfort band, so less is needed
788
+ * then. Subjects: ROOM, FLOOR_ZONE.
789
+ *
790
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_PRE_HEAT = 1;
791
+ */
792
+ PRE_HEAT = 1,
793
+
794
+ /**
795
+ * Held back while stored heat carries the room, within the comfort band. Subjects: ROOM,
796
+ * FLOOR_ZONE.
797
+ *
798
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_COASTING = 2;
799
+ */
800
+ COASTING = 2,
801
+
802
+ /**
803
+ * Held back while energy is expensive, within the comfort band. Subjects: ROOM,
804
+ * FLOOR_ZONE, COMFORT_LOAD, ADD_ON_HEATER.
805
+ *
806
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_PRICE_HIGH = 3;
807
+ */
808
+ PRICE_HIGH = 3,
809
+
810
+ /**
811
+ * Held back to keep the home's own electricity use below a peak it is charged for.
812
+ * Subjects: ROOM, FLOOR_ZONE, COMFORT_LOAD, ADD_ON_HEATER.
813
+ *
814
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_PEAK_GUARD = 4;
815
+ */
816
+ PEAK_GUARD = 4,
817
+
818
+ /**
819
+ * Paused while the heat source heats domestic hot water. Subjects: ROOM, FLOOR_ZONE.
820
+ *
821
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_HOT_WATER_PRIORITY = 5;
822
+ */
823
+ HOT_WATER_PRIORITY = 5,
824
+
825
+ /**
826
+ * Held back to keep electricity that several homes share — a building's connection, a
827
+ * shared heat source — within its limit. Subjects: ROOM, FLOOR_ZONE, COMFORT_LOAD,
828
+ * ADD_ON_HEATER.
829
+ *
830
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_SHARED_POWER_BUDGET = 6;
831
+ */
832
+ SHARED_POWER_BUDGET = 6,
833
+
834
+ /**
835
+ * Held back to keep a district-heating connection below its charged peak. Subjects:
836
+ * ROOM, FLOOR_ZONE.
837
+ *
838
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_DISTRICT_HEATING_PEAK = 7;
839
+ */
840
+ DISTRICT_HEATING_PEAK = 7,
841
+
842
+ /**
843
+ * Not heated further because the room is at the top of its comfort band, even though
844
+ * energy is cheap. Subjects: ROOM, FLOOR_ZONE.
845
+ *
846
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_AT_COMFORT_CEILING = 8;
847
+ */
848
+ AT_COMFORT_CEILING = 8,
849
+
850
+ /**
851
+ * Run on a cautious fixed share of the time because the reading that steers it has gone
852
+ * quiet. Subjects: FLOOR_ZONE only — a room's own lost sensor is told by condition. In
853
+ * the room whose sensor steers the zone, condition says the sensor is lost and this says
854
+ * what the zone does about it.
855
+ *
856
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_NO_READING = 9;
857
+ */
858
+ NO_READING = 9,
859
+
860
+ /**
861
+ * Off because it is outside its time window — a heated floor kept warm for comfort, a
862
+ * towel heater. Subjects: COMFORT_LOAD only.
863
+ *
864
+ * @generated from enum value: CLIMATE_EXPLANATION_KIND_OUTSIDE_WINDOW = 10;
865
+ */
866
+ OUTSIDE_WINDOW = 10,
867
+ }
868
+
869
+ /**
870
+ * Describes the enum kusinta.iot.climate.v1.ClimateExplanationKind.
871
+ */
872
+ export declare const ClimateExplanationKindSchema: GenEnum<ClimateExplanationKind>;
873
+
874
+ /**
875
+ * What a cause acts on.
876
+ *
877
+ * @generated from enum kusinta.iot.climate.v1.ClimateExplanationSubject
878
+ */
879
+ export enum ClimateExplanationSubject {
880
+ /**
881
+ * Sender did not set a subject, or sent one this client's schema does not know — some
882
+ * decoders read an unknown value as this one. Never the room as a whole.
883
+ *
884
+ * @generated from enum value: CLIMATE_EXPLANATION_SUBJECT_UNSPECIFIED = 0;
885
+ */
886
+ UNSPECIFIED = 0,
887
+
888
+ /**
889
+ * The room's heating as a whole.
890
+ *
891
+ * @generated from enum value: CLIMATE_EXPLANATION_SUBJECT_ROOM = 1;
892
+ */
893
+ ROOM = 1,
894
+
895
+ /**
896
+ * A floor zone heating this room. A zone's explanation is sent only in rooms on the same
897
+ * side of a home's boundary as the zone's control room: rooms in the same home as it, or
898
+ * rooms outside homes when it is outside one. A zone that heats rooms on both sides
899
+ * explains itself on its control room's side alone, so a fact withheld across that
900
+ * boundary does not cross it here.
901
+ *
902
+ * @generated from enum value: CLIMATE_EXPLANATION_SUBJECT_FLOOR_ZONE = 2;
903
+ */
904
+ FLOOR_ZONE = 2,
905
+
906
+ /**
907
+ * A comfort load in the room: a heated floor kept warm for comfort, a towel heater.
908
+ *
909
+ * @generated from enum value: CLIMATE_EXPLANATION_SUBJECT_COMFORT_LOAD = 3;
910
+ */
911
+ COMFORT_LOAD = 3,
912
+
913
+ /**
914
+ * The heat source's add-on heater.
915
+ *
916
+ * @generated from enum value: CLIMATE_EXPLANATION_SUBJECT_ADD_ON_HEATER = 4;
917
+ */
918
+ ADD_ON_HEATER = 4,
919
+ }
920
+
921
+ /**
922
+ * Describes the enum kusinta.iot.climate.v1.ClimateExplanationSubject.
923
+ */
924
+ export declare const ClimateExplanationSubjectSchema: GenEnum<ClimateExplanationSubject>;
925
+
622
926
  /**
623
927
  * A setback that applies to every room in a space while it is on.
624
928
  *
@@ -10,7 +10,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
10
10
  * Describes the file kusinta/iot/climate/v1/climate.proto.
11
11
  */
12
12
  export const file_kusinta_iot_climate_v1_climate = /*@__PURE__*/
13
- fileDesc("CiRrdXNpbnRhL2lvdC9jbGltYXRlL3YxL2NsaW1hdGUucHJvdG8SFmt1c2ludGEuaW90LmNsaW1hdGUudjEiogEKDFRhcmdldENoYW5nZRImCgJhdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoEdXNlchgCIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZEgAEjMKBmRldmljZRgDIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkSABCBAoCYnki/wUKC1Jvb21DbGltYXRlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIgChN0YXJnZXRfY2VudGlkZWdyZWVzGAIgASgRSACIAQESOwoNdGFyZ2V0X2NoYW5nZRgDIAEoCzIkLmt1c2ludGEuaW90LmNsaW1hdGUudjEuVGFyZ2V0Q2hhbmdlEioKHWVmZmVjdGl2ZV90YXJnZXRfY2VudGlkZWdyZWVzGAQgASgRSAGIAQESFgoOb3ZlcnJpZGVzX21vZGUYBSABKAgSNwoNbW9kZV9zcGFjZV9pZBgNIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSHQoQbWluX2NlbnRpZGVncmVlcxgGIAEoEUgCiAEBEh0KEG1heF9jZW50aWRlZ3JlZXMYByABKBFIA4gBARI1CgpzZW5zb3JfaWRzGAggAygLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSGgoSc2Vuc29yc19jb25maWd1cmVkGA4gASgIEiIKFW1lYXN1cmVkX2NlbnRpZGVncmVlcxgJIAEoEUgEiAEBEjYKC21lYXN1cmVkX2J5GAogASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSPwoJY29uZGl0aW9uGAsgASgOMiwua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tQ2xpbWF0ZUNvbmRpdGlvbhIcChRsb2NrX2RldmljZV9jb250cm9scxgMIAEoCBIWCg5zdGF0ZV93aXRoaGVsZBgPIAEoCEIWChRfdGFyZ2V0X2NlbnRpZGVncmVlc0IgCh5fZWZmZWN0aXZlX3RhcmdldF9jZW50aWRlZ3JlZXNCEwoRX21pbl9jZW50aWRlZ3JlZXNCEwoRX21heF9jZW50aWRlZ3JlZXNCGAoWX21lYXN1cmVkX2NlbnRpZGVncmVlcyKDAwoLQ2xpbWF0ZU1vZGUSMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjUKBGtpbmQYAiABKA4yJy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkNsaW1hdGVNb2RlS2luZBIhChRzZXRiYWNrX2NlbnRpZGVncmVlcxgDIAEoEUgAiAEBEi0KCXN0YXJ0c19hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKwoHZW5kc19hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoGc2V0X2J5GAYgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEjIKCXdhcm1fZnJvbRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAYgBAUIXChVfc2V0YmFja19jZW50aWRlZ3JlZXNCDAoKX3dhcm1fZnJvbSJ5Cg9Sb29tQ2xpbWF0ZUxpc3QSMgoFcm9vbXMYASADKAsyIy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLlJvb21DbGltYXRlEjIKBW1vZGVzGAIgAygLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlTW9kZSLzAgoRUm9vbUhpc3RvcnlTYW1wbGUSJgoCYXQYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiIKFW1lYXN1cmVkX2NlbnRpZGVncmVlcxgCIAEoEUgAiAEBEiAKE3RhcmdldF9jZW50aWRlZ3JlZXMYAyABKBFIAYgBARIqCh1lZmZlY3RpdmVfdGFyZ2V0X2NlbnRpZGVncmVlcxgEIAEoEUgCiAEBEiAKE3ZhbHZlX29wZW5fcGVybWlsbGUYBSABKA1IA4gBARIfChJ2YWx2ZV9vcGVuX3NlY29uZHMYBiABKA1IBIgBAUIYChZfbWVhc3VyZWRfY2VudGlkZWdyZWVzQhYKFF90YXJnZXRfY2VudGlkZWdyZWVzQiAKHl9lZmZlY3RpdmVfdGFyZ2V0X2NlbnRpZGVncmVlc0IWChRfdmFsdmVfb3Blbl9wZXJtaWxsZUIVChNfdmFsdmVfb3Blbl9zZWNvbmRzIqsBCgtSb29tSGlzdG9yeRIxCgdyb29tX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBItCglrZXB0X2Zyb20YAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjoKB3NhbXBsZXMYAyADKAsyKS5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLlJvb21IaXN0b3J5U2FtcGxlItQCChFDbGltYXRlUGVyaW9kTWVhbhItCglzdGFydHNfYXQYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB2VuZHNfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiIKFW1lYXN1cmVkX2NlbnRpZGVncmVlcxgDIAEoEUgAiAEBEiAKE3RhcmdldF9jZW50aWRlZ3JlZXMYBCABKBFIAYgBARIiChptZWFzdXJlZF9jb3ZlcmFnZV9wZXJtaWxsZRgFIAEoDRIgChh0YXJnZXRfY292ZXJhZ2VfcGVybWlsbGUYBiABKA0SFgoOcm9vbXNfbWVhc3VyZWQYByABKA0SDQoFcm9vbXMYCCABKA1CGAoWX21lYXN1cmVkX2NlbnRpZGVncmVlc0IWChRfdGFyZ2V0X2NlbnRpZGVncmVlcyK+AgoXQXBhcnRtZW50Q2xpbWF0ZVN1bW1hcnkSNgoMYXBhcnRtZW50X2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI8CgZwZXJpb2QYAiABKA4yLC5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkNsaW1hdGVTdW1tYXJ5UGVyaW9kEkIKCXdlaWdodGluZxgDIAEoDjIvLmt1c2ludGEuaW90LmNsaW1hdGUudjEuQ2xpbWF0ZVN1bW1hcnlXZWlnaHRpbmcSLQoJa2VwdF9mcm9tGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI6CgdwZXJpb2RzGAUgAygLMikua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlUGVyaW9kTWVhbirVAgoUUm9vbUNsaW1hdGVDb25kaXRpb24SJgoiUk9PTV9DTElNQVRFX0NPTkRJVElPTl9VTlNQRUNJRklFRBAAEiIKHlJPT01fQ0xJTUFURV9DT05ESVRJT05fSE9MRElORxABEiQKIFJPT01fQ0xJTUFURV9DT05ESVRJT05fTk9fVEFSR0VUEAISJgoiUk9PTV9DTElNQVRFX0NPTkRJVElPTl9TRU5TT1JfTE9TVBADEiYKIlJPT01fQ0xJTUFURV9DT05ESVRJT05fV0lORE9XX09QRU4QBBIlCiFST09NX0NMSU1BVEVfQ09ORElUSU9OX05PX0hFQVRJTkcQBRIuCipST09NX0NMSU1BVEVfQ09ORElUSU9OX0hFQVRJTkdfVU5SRUFDSEFCTEUQBhIkCiBST09NX0NMSU1BVEVfQ09ORElUSU9OX05PX1NFTlNPUhAHKm8KD0NsaW1hdGVNb2RlS2luZBIhCh1DTElNQVRFX01PREVfS0lORF9VTlNQRUNJRklFRBAAEhoKFkNMSU1BVEVfTU9ERV9LSU5EX0FXQVkQARIdChlDTElNQVRFX01PREVfS0lORF9IT0xJREFZEAIqoQEKFENsaW1hdGVTdW1tYXJ5UGVyaW9kEiYKIkNMSU1BVEVfU1VNTUFSWV9QRVJJT0RfVU5TUEVDSUZJRUQQABIeChpDTElNQVRFX1NVTU1BUllfUEVSSU9EX0RBWRABEh8KG0NMSU1BVEVfU1VNTUFSWV9QRVJJT0RfV0VFSxACEiAKHENMSU1BVEVfU1VNTUFSWV9QRVJJT0RfTU9OVEgQAypvChdDbGltYXRlU3VtbWFyeVdlaWdodGluZxIpCiVDTElNQVRFX1NVTU1BUllfV0VJR0hUSU5HX1VOU1BFQ0lGSUVEEAASKQolQ0xJTUFURV9TVU1NQVJZX1dFSUdIVElOR19ST09NU19FUVVBTBABQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_identity_v1_identity]);
13
+ fileDesc("CiRrdXNpbnRhL2lvdC9jbGltYXRlL3YxL2NsaW1hdGUucHJvdG8SFmt1c2ludGEuaW90LmNsaW1hdGUudjEiogEKDFRhcmdldENoYW5nZRImCgJhdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoEdXNlchgCIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZEgAEjMKBmRldmljZRgDIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkSABCBAoCYnkizggKC1Jvb21DbGltYXRlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIgChN0YXJnZXRfY2VudGlkZWdyZWVzGAIgASgRSACIAQESOwoNdGFyZ2V0X2NoYW5nZRgDIAEoCzIkLmt1c2ludGEuaW90LmNsaW1hdGUudjEuVGFyZ2V0Q2hhbmdlEioKHWVmZmVjdGl2ZV90YXJnZXRfY2VudGlkZWdyZWVzGAQgASgRSAGIAQESFgoOb3ZlcnJpZGVzX21vZGUYBSABKAgSNwoNbW9kZV9zcGFjZV9pZBgNIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSHQoQbWluX2NlbnRpZGVncmVlcxgGIAEoEUgCiAEBEh0KEG1heF9jZW50aWRlZ3JlZXMYByABKBFIA4gBARI1CgpzZW5zb3JfaWRzGAggAygLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSGgoSc2Vuc29yc19jb25maWd1cmVkGA4gASgIEiIKFW1lYXN1cmVkX2NlbnRpZGVncmVlcxgJIAEoEUgEiAEBEjYKC21lYXN1cmVkX2J5GAogASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSPwoJY29uZGl0aW9uGAsgASgOMiwua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tQ2xpbWF0ZUNvbmRpdGlvbhIcChRsb2NrX2RldmljZV9jb250cm9scxgMIAEoCBIWCg5zdGF0ZV93aXRoaGVsZBgPIAEoCBJACgxleHBsYW5hdGlvbnMYECADKAsyKi5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkNsaW1hdGVFeHBsYW5hdGlvbhI1ChF0YXJnZXRfaGVsZF91bnRpbBgRIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNgoIcGxhbm5pbmcYEiABKA4yJC5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLlJvb21QbGFubmluZxIqCh1jb21mb3J0X2JhbmRfbG93X2NlbnRpZGVncmVlcxgTIAEoEUgFiAEBEisKHmNvbWZvcnRfYmFuZF9oaWdoX2NlbnRpZGVncmVlcxgUIAEoEUgGiAEBQhYKFF90YXJnZXRfY2VudGlkZWdyZWVzQiAKHl9lZmZlY3RpdmVfdGFyZ2V0X2NlbnRpZGVncmVlc0ITChFfbWluX2NlbnRpZGVncmVlc0ITChFfbWF4X2NlbnRpZGVncmVlc0IYChZfbWVhc3VyZWRfY2VudGlkZWdyZWVzQiAKHl9jb21mb3J0X2JhbmRfbG93X2NlbnRpZGVncmVlc0IhCh9fY29tZm9ydF9iYW5kX2hpZ2hfY2VudGlkZWdyZWVzIsMBChJDbGltYXRlRXhwbGFuYXRpb24SPAoEa2luZBgBIAEoDjIuLmt1c2ludGEuaW90LmNsaW1hdGUudjEuQ2xpbWF0ZUV4cGxhbmF0aW9uS2luZBJCCgdzdWJqZWN0GAIgASgOMjEua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlRXhwbGFuYXRpb25TdWJqZWN0EisKB2VuZHNfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIoMDCgtDbGltYXRlTW9kZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSNQoEa2luZBgCIAEoDjInLmt1c2ludGEuaW90LmNsaW1hdGUudjEuQ2xpbWF0ZU1vZGVLaW5kEiEKFHNldGJhY2tfY2VudGlkZWdyZWVzGAMgASgRSACIAQESLQoJc3RhcnRzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIrCgdlbmRzX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgZzZXRfYnkYBiABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSMgoJd2FybV9mcm9tGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgBiAEBQhcKFV9zZXRiYWNrX2NlbnRpZGVncmVlc0IMCgpfd2FybV9mcm9tInkKD1Jvb21DbGltYXRlTGlzdBIyCgVyb29tcxgBIAMoCzIjLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUNsaW1hdGUSMgoFbW9kZXMYAiADKAsyIy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkNsaW1hdGVNb2RlIvMCChFSb29tSGlzdG9yeVNhbXBsZRImCgJhdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoVbWVhc3VyZWRfY2VudGlkZWdyZWVzGAIgASgRSACIAQESIAoTdGFyZ2V0X2NlbnRpZGVncmVlcxgDIAEoEUgBiAEBEioKHWVmZmVjdGl2ZV90YXJnZXRfY2VudGlkZWdyZWVzGAQgASgRSAKIAQESIAoTdmFsdmVfb3Blbl9wZXJtaWxsZRgFIAEoDUgDiAEBEh8KEnZhbHZlX29wZW5fc2Vjb25kcxgGIAEoDUgEiAEBQhgKFl9tZWFzdXJlZF9jZW50aWRlZ3JlZXNCFgoUX3RhcmdldF9jZW50aWRlZ3JlZXNCIAoeX2VmZmVjdGl2ZV90YXJnZXRfY2VudGlkZWdyZWVzQhYKFF92YWx2ZV9vcGVuX3Blcm1pbGxlQhUKE192YWx2ZV9vcGVuX3NlY29uZHMiqwEKC1Jvb21IaXN0b3J5EjEKB3Jvb21faWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEi0KCWtlcHRfZnJvbRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASOgoHc2FtcGxlcxgDIAMoCzIpLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUhpc3RvcnlTYW1wbGUi1AIKEUNsaW1hdGVQZXJpb2RNZWFuEi0KCXN0YXJ0c19hdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKwoHZW5kc19hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoVbWVhc3VyZWRfY2VudGlkZWdyZWVzGAMgASgRSACIAQESIAoTdGFyZ2V0X2NlbnRpZGVncmVlcxgEIAEoEUgBiAEBEiIKGm1lYXN1cmVkX2NvdmVyYWdlX3Blcm1pbGxlGAUgASgNEiAKGHRhcmdldF9jb3ZlcmFnZV9wZXJtaWxsZRgGIAEoDRIWCg5yb29tc19tZWFzdXJlZBgHIAEoDRINCgVyb29tcxgIIAEoDUIYChZfbWVhc3VyZWRfY2VudGlkZWdyZWVzQhYKFF90YXJnZXRfY2VudGlkZWdyZWVzIr4CChdBcGFydG1lbnRDbGltYXRlU3VtbWFyeRI2CgxhcGFydG1lbnRfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjwKBnBlcmlvZBgCIAEoDjIsLmt1c2ludGEuaW90LmNsaW1hdGUudjEuQ2xpbWF0ZVN1bW1hcnlQZXJpb2QSQgoJd2VpZ2h0aW5nGAMgASgOMi8ua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlU3VtbWFyeVdlaWdodGluZxItCglrZXB0X2Zyb20YBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjoKB3BlcmlvZHMYBSADKAsyKS5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkNsaW1hdGVQZXJpb2RNZWFuKtUCChRSb29tQ2xpbWF0ZUNvbmRpdGlvbhImCiJST09NX0NMSU1BVEVfQ09ORElUSU9OX1VOU1BFQ0lGSUVEEAASIgoeUk9PTV9DTElNQVRFX0NPTkRJVElPTl9IT0xESU5HEAESJAogUk9PTV9DTElNQVRFX0NPTkRJVElPTl9OT19UQVJHRVQQAhImCiJST09NX0NMSU1BVEVfQ09ORElUSU9OX1NFTlNPUl9MT1NUEAMSJgoiUk9PTV9DTElNQVRFX0NPTkRJVElPTl9XSU5ET1dfT1BFThAEEiUKIVJPT01fQ0xJTUFURV9DT05ESVRJT05fTk9fSEVBVElORxAFEi4KKlJPT01fQ0xJTUFURV9DT05ESVRJT05fSEVBVElOR19VTlJFQUNIQUJMRRAGEiQKIFJPT01fQ0xJTUFURV9DT05ESVRJT05fTk9fU0VOU09SEAcqhgEKDFJvb21QbGFubmluZxIdChlST09NX1BMQU5OSU5HX1VOU1BFQ0lGSUVEEAASGQoVUk9PTV9QTEFOTklOR19QTEFOTkVEEAESHQoZUk9PTV9QTEFOTklOR19OT1RfUExBTk5FRBACEh0KGVJPT01fUExBTk5JTkdfVU5BVkFJTEFCTEUQAyqABAoWQ2xpbWF0ZUV4cGxhbmF0aW9uS2luZBIoCiRDTElNQVRFX0VYUExBTkFUSU9OX0tJTkRfVU5TUEVDSUZJRUQQABIlCiFDTElNQVRFX0VYUExBTkFUSU9OX0tJTkRfUFJFX0hFQVQQARIlCiFDTElNQVRFX0VYUExBTkFUSU9OX0tJTkRfQ09BU1RJTkcQAhInCiNDTElNQVRFX0VYUExBTkFUSU9OX0tJTkRfUFJJQ0VfSElHSBADEicKI0NMSU1BVEVfRVhQTEFOQVRJT05fS0lORF9QRUFLX0dVQVJEEAQSLworQ0xJTUFURV9FWFBMQU5BVElPTl9LSU5EX0hPVF9XQVRFUl9QUklPUklUWRAFEjAKLENMSU1BVEVfRVhQTEFOQVRJT05fS0lORF9TSEFSRURfUE9XRVJfQlVER0VUEAYSMgouQ0xJTUFURV9FWFBMQU5BVElPTl9LSU5EX0RJU1RSSUNUX0hFQVRJTkdfUEVBSxAHEi8KK0NMSU1BVEVfRVhQTEFOQVRJT05fS0lORF9BVF9DT01GT1JUX0NFSUxJTkcQCBInCiNDTElNQVRFX0VYUExBTkFUSU9OX0tJTkRfTk9fUkVBRElORxAJEisKJ0NMSU1BVEVfRVhQTEFOQVRJT05fS0lORF9PVVRTSURFX1dJTkRPVxAKKvcBChlDbGltYXRlRXhwbGFuYXRpb25TdWJqZWN0EisKJ0NMSU1BVEVfRVhQTEFOQVRJT05fU1VCSkVDVF9VTlNQRUNJRklFRBAAEiQKIENMSU1BVEVfRVhQTEFOQVRJT05fU1VCSkVDVF9ST09NEAESKgomQ0xJTUFURV9FWFBMQU5BVElPTl9TVUJKRUNUX0ZMT09SX1pPTkUQAhIsCihDTElNQVRFX0VYUExBTkFUSU9OX1NVQkpFQ1RfQ09NRk9SVF9MT0FEEAMSLQopQ0xJTUFURV9FWFBMQU5BVElPTl9TVUJKRUNUX0FERF9PTl9IRUFURVIQBCpvCg9DbGltYXRlTW9kZUtpbmQSIQodQ0xJTUFURV9NT0RFX0tJTkRfVU5TUEVDSUZJRUQQABIaChZDTElNQVRFX01PREVfS0lORF9BV0FZEAESHQoZQ0xJTUFURV9NT0RFX0tJTkRfSE9MSURBWRACKqEBChRDbGltYXRlU3VtbWFyeVBlcmlvZBImCiJDTElNQVRFX1NVTU1BUllfUEVSSU9EX1VOU1BFQ0lGSUVEEAASHgoaQ0xJTUFURV9TVU1NQVJZX1BFUklPRF9EQVkQARIfChtDTElNQVRFX1NVTU1BUllfUEVSSU9EX1dFRUsQAhIgChxDTElNQVRFX1NVTU1BUllfUEVSSU9EX01PTlRIEAMqbwoXQ2xpbWF0ZVN1bW1hcnlXZWlnaHRpbmcSKQolQ0xJTUFURV9TVU1NQVJZX1dFSUdIVElOR19VTlNQRUNJRklFRBAAEikKJUNMSU1BVEVfU1VNTUFSWV9XRUlHSFRJTkdfUk9PTVNfRVFVQUwQAUICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_identity_v1_identity]);
14
14
 
15
15
  /**
16
16
  * Describes the message kusinta.iot.climate.v1.TargetChange.
@@ -26,47 +26,54 @@ export const TargetChangeSchema = /*@__PURE__*/
26
26
  export const RoomClimateSchema = /*@__PURE__*/
27
27
  messageDesc(file_kusinta_iot_climate_v1_climate, 1);
28
28
 
29
+ /**
30
+ * Describes the message kusinta.iot.climate.v1.ClimateExplanation.
31
+ * Use `create(ClimateExplanationSchema)` to create a new message.
32
+ */
33
+ export const ClimateExplanationSchema = /*@__PURE__*/
34
+ messageDesc(file_kusinta_iot_climate_v1_climate, 2);
35
+
29
36
  /**
30
37
  * Describes the message kusinta.iot.climate.v1.ClimateMode.
31
38
  * Use `create(ClimateModeSchema)` to create a new message.
32
39
  */
33
40
  export const ClimateModeSchema = /*@__PURE__*/
34
- messageDesc(file_kusinta_iot_climate_v1_climate, 2);
41
+ messageDesc(file_kusinta_iot_climate_v1_climate, 3);
35
42
 
36
43
  /**
37
44
  * Describes the message kusinta.iot.climate.v1.RoomClimateList.
38
45
  * Use `create(RoomClimateListSchema)` to create a new message.
39
46
  */
40
47
  export const RoomClimateListSchema = /*@__PURE__*/
41
- messageDesc(file_kusinta_iot_climate_v1_climate, 3);
48
+ messageDesc(file_kusinta_iot_climate_v1_climate, 4);
42
49
 
43
50
  /**
44
51
  * Describes the message kusinta.iot.climate.v1.RoomHistorySample.
45
52
  * Use `create(RoomHistorySampleSchema)` to create a new message.
46
53
  */
47
54
  export const RoomHistorySampleSchema = /*@__PURE__*/
48
- messageDesc(file_kusinta_iot_climate_v1_climate, 4);
55
+ messageDesc(file_kusinta_iot_climate_v1_climate, 5);
49
56
 
50
57
  /**
51
58
  * Describes the message kusinta.iot.climate.v1.RoomHistory.
52
59
  * Use `create(RoomHistorySchema)` to create a new message.
53
60
  */
54
61
  export const RoomHistorySchema = /*@__PURE__*/
55
- messageDesc(file_kusinta_iot_climate_v1_climate, 5);
62
+ messageDesc(file_kusinta_iot_climate_v1_climate, 6);
56
63
 
57
64
  /**
58
65
  * Describes the message kusinta.iot.climate.v1.ClimatePeriodMean.
59
66
  * Use `create(ClimatePeriodMeanSchema)` to create a new message.
60
67
  */
61
68
  export const ClimatePeriodMeanSchema = /*@__PURE__*/
62
- messageDesc(file_kusinta_iot_climate_v1_climate, 6);
69
+ messageDesc(file_kusinta_iot_climate_v1_climate, 7);
63
70
 
64
71
  /**
65
72
  * Describes the message kusinta.iot.climate.v1.ApartmentClimateSummary.
66
73
  * Use `create(ApartmentClimateSummarySchema)` to create a new message.
67
74
  */
68
75
  export const ApartmentClimateSummarySchema = /*@__PURE__*/
69
- messageDesc(file_kusinta_iot_climate_v1_climate, 7);
76
+ messageDesc(file_kusinta_iot_climate_v1_climate, 8);
70
77
 
71
78
  /**
72
79
  * Describes the enum kusinta.iot.climate.v1.RoomClimateCondition.
@@ -87,11 +94,68 @@ export const RoomClimateConditionSchema = /*@__PURE__*/
87
94
  export const RoomClimateCondition = /*@__PURE__*/
88
95
  tsEnum(RoomClimateConditionSchema);
89
96
 
97
+ /**
98
+ * Describes the enum kusinta.iot.climate.v1.RoomPlanning.
99
+ */
100
+ export const RoomPlanningSchema = /*@__PURE__*/
101
+ enumDesc(file_kusinta_iot_climate_v1_climate, 1);
102
+
103
+ /**
104
+ * Whether a plan steers a room: one that looks ahead at prices, weather and the heat
105
+ * source and moves the room within its comfort band. A standing state of the room, not a
106
+ * reason, so it is a field of its own rather than an explanation.
107
+ *
108
+ * @generated from enum kusinta.iot.climate.v1.RoomPlanning
109
+ */
110
+ export const RoomPlanning = /*@__PURE__*/
111
+ tsEnum(RoomPlanningSchema);
112
+
113
+ /**
114
+ * Describes the enum kusinta.iot.climate.v1.ClimateExplanationKind.
115
+ */
116
+ export const ClimateExplanationKindSchema = /*@__PURE__*/
117
+ enumDesc(file_kusinta_iot_climate_v1_climate, 2);
118
+
119
+ /**
120
+ * What held a room, or a part of its heating, where it is. A closed list of causes: the
121
+ * gateway sends a kind, never a sentence, and the app names each kind in its user's
122
+ * language. What the cause acts on is ClimateExplanation.subject, and each kind lists the
123
+ * subjects it may carry. A pair a kind does not list is shown as nothing, so a pair added
124
+ * later reaches an older app as nothing rather than as a guess.
125
+ *
126
+ * No kind identifies another household or anything about one, its activity included.
127
+ * Where a limit is shared — a building's power, a shared heat source — the explanation
128
+ * says that this room was limited, never by whom or because of whom. A kind that a source
129
+ * or limit shared with other homes drives — HOT_WATER_PRIORITY on a shared heat source,
130
+ * SHARED_POWER_BUDGET, DISTRICT_HEATING_PEAK on a shared connection — is sent only where at
131
+ * least three homes share that source or limit, in rooms in homes and outside them alike.
132
+ * Below that, its onset and end would track another home's use as it happens, and the
133
+ * room carries no explanation for it.
134
+ *
135
+ * @generated from enum kusinta.iot.climate.v1.ClimateExplanationKind
136
+ */
137
+ export const ClimateExplanationKind = /*@__PURE__*/
138
+ tsEnum(ClimateExplanationKindSchema);
139
+
140
+ /**
141
+ * Describes the enum kusinta.iot.climate.v1.ClimateExplanationSubject.
142
+ */
143
+ export const ClimateExplanationSubjectSchema = /*@__PURE__*/
144
+ enumDesc(file_kusinta_iot_climate_v1_climate, 3);
145
+
146
+ /**
147
+ * What a cause acts on.
148
+ *
149
+ * @generated from enum kusinta.iot.climate.v1.ClimateExplanationSubject
150
+ */
151
+ export const ClimateExplanationSubject = /*@__PURE__*/
152
+ tsEnum(ClimateExplanationSubjectSchema);
153
+
90
154
  /**
91
155
  * Describes the enum kusinta.iot.climate.v1.ClimateModeKind.
92
156
  */
93
157
  export const ClimateModeKindSchema = /*@__PURE__*/
94
- enumDesc(file_kusinta_iot_climate_v1_climate, 1);
158
+ enumDesc(file_kusinta_iot_climate_v1_climate, 4);
95
159
 
96
160
  /**
97
161
  * A setback that applies to every room in a space while it is on.
@@ -105,7 +169,7 @@ export const ClimateModeKind = /*@__PURE__*/
105
169
  * Describes the enum kusinta.iot.climate.v1.ClimateSummaryPeriod.
106
170
  */
107
171
  export const ClimateSummaryPeriodSchema = /*@__PURE__*/
108
- enumDesc(file_kusinta_iot_climate_v1_climate, 2);
172
+ enumDesc(file_kusinta_iot_climate_v1_climate, 5);
109
173
 
110
174
  /**
111
175
  * The length of the periods an ApartmentClimateSummary is given in. Each period runs from
@@ -130,7 +194,7 @@ export const ClimateSummaryPeriod = /*@__PURE__*/
130
194
  * Describes the enum kusinta.iot.climate.v1.ClimateSummaryWeighting.
131
195
  */
132
196
  export const ClimateSummaryWeightingSchema = /*@__PURE__*/
133
- enumDesc(file_kusinta_iot_climate_v1_climate, 3);
197
+ enumDesc(file_kusinta_iot_climate_v1_climate, 6);
134
198
 
135
199
  /**
136
200
  * How an apartment's mean is formed from its rooms' means.
@@ -2,7 +2,7 @@
2
2
  // @generated from file kusinta/iot/device/v1/cluster_state.proto (package kusinta.iot.device.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
5
+ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
 
8
8
  /**
@@ -272,6 +272,21 @@ export declare type ClusterState = Message<"kusinta.iot.device.v1.ClusterState">
272
272
  * @generated from field: map<uint32, uint32> attribute_steps = 7;
273
273
  */
274
274
  attributeSteps: { [key: number]: number };
275
+
276
+ /**
277
+ * What a write to each attribute leaves behind, and how late its reports arrive, keyed by
278
+ * attribute id. See AttributeBehaviour. Its step stays in attribute_steps.
279
+ *
280
+ * Per endpoint because a ClusterState belongs to one endpoint: a device with several
281
+ * independently switched outputs states each output's behaviour on that output's
282
+ * endpoint. A vendor parameter, which has no cluster, states its behaviour in
283
+ * Endpoint.vendor_attribute_behaviours.
284
+ *
285
+ * Stated by the producer at announcement. An absent key is "not stated".
286
+ *
287
+ * @generated from field: map<uint32, kusinta.iot.device.v1.AttributeBehaviour> attribute_behaviours = 8;
288
+ */
289
+ attributeBehaviours: { [key: number]: AttributeBehaviour };
275
290
  };
276
291
 
277
292
  /**
@@ -280,3 +295,181 @@ export declare type ClusterState = Message<"kusinta.iot.device.v1.ClusterState">
280
295
  */
281
296
  export declare const ClusterStateSchema: GenMessage<ClusterState>;
282
297
 
298
+ /**
299
+ * What a write to one attribute leaves behind, and how late its reports arrive. Stated per
300
+ * attribute, per endpoint, by the producer that knows the device.
301
+ *
302
+ * A consumer that leaves a written value in place while it is gone — a gateway steering
303
+ * heat — needs to know what the device does on its own. Not stated is read as the worst
304
+ * case: a write whose kind is not stated is held as if sticky, and a reading whose latency
305
+ * is not stated is never treated as real-time.
306
+ *
307
+ * A gateway MUST NOT drive a heat source, a heating circuit or a floor zone through an
308
+ * attribute whose write kind is not stated here: it refuses the write. This is the
309
+ * opposite default to attribute_ids or a connector's known_links, where not stated only
310
+ * means not known; for an output that heats a home, not stated means no. Rollout order: a
311
+ * producer that carries such outputs states their behaviour before a gateway that drives
312
+ * them takes the release that enforces this.
313
+ *
314
+ * @generated from message kusinta.iot.device.v1.AttributeBehaviour
315
+ */
316
+ export declare type AttributeBehaviour = Message<"kusinta.iot.device.v1.AttributeBehaviour"> & {
317
+ /**
318
+ * What a write leaves behind when its writer goes quiet. Unset: not stated.
319
+ *
320
+ * @generated from oneof kusinta.iot.device.v1.AttributeBehaviour.write
321
+ */
322
+ write: {
323
+ /**
324
+ * @generated from field: kusinta.iot.device.v1.StickyWrite sticky = 1;
325
+ */
326
+ value: StickyWrite;
327
+ case: "sticky";
328
+ } | {
329
+ /**
330
+ * @generated from field: kusinta.iot.device.v1.LeasedWrite leased = 2;
331
+ */
332
+ value: LeasedWrite;
333
+ case: "leased";
334
+ } | { case: undefined; value?: undefined };
335
+
336
+ /**
337
+ * The value the attribute takes when the device's power returns. Stated only for an
338
+ * attribute whose cluster has no startup attribute of its own: where the cluster has one
339
+ * (OnOff's StartUpOnOff, Level Control's StartUpCurrentLevel), that attribute says it and
340
+ * this stays unset, so the value lives in one place. Unset: not stated.
341
+ *
342
+ * @generated from field: kusinta.iot.device.v1.AttributeValue power_on_value = 3;
343
+ */
344
+ powerOnValue?: AttributeValue | undefined;
345
+
346
+ /**
347
+ * How late a reported value reaches the producer. Unset: not stated, never REAL_TIME.
348
+ *
349
+ * @generated from field: kusinta.iot.device.v1.ReadLatency read_latency = 4;
350
+ */
351
+ readLatency: ReadLatency;
352
+ };
353
+
354
+ /**
355
+ * Describes the message kusinta.iot.device.v1.AttributeBehaviour.
356
+ * Use `create(AttributeBehaviourSchema)` to create a new message.
357
+ */
358
+ export declare const AttributeBehaviourSchema: GenMessage<AttributeBehaviour>;
359
+
360
+ /**
361
+ * The device holds a written value until something writes it again: through the writer's
362
+ * absence and a lost network. A writer that may go quiet writes a value it can live with
363
+ * being left in place.
364
+ *
365
+ * @generated from message kusinta.iot.device.v1.StickyWrite
366
+ */
367
+ export declare type StickyWrite = Message<"kusinta.iot.device.v1.StickyWrite"> & {
368
+ };
369
+
370
+ /**
371
+ * Describes the message kusinta.iot.device.v1.StickyWrite.
372
+ * Use `create(StickyWriteSchema)` to create a new message.
373
+ */
374
+ export declare const StickyWriteSchema: GenMessage<StickyWrite>;
375
+
376
+ /**
377
+ * The device itself returns the attribute to lapse_value when a write's lease runs out,
378
+ * whether or not anything is still talking to it. The lease is kept by the device — a
379
+ * timer, or a watchdog on the device's own link — never by the writer re-sending: a value
380
+ * that lapses only because its writer keeps renewing it is sticky to anyone who has to
381
+ * plan for the writer failing.
382
+ *
383
+ * @generated from message kusinta.iot.device.v1.LeasedWrite
384
+ */
385
+ export declare type LeasedWrite = Message<"kusinta.iot.device.v1.LeasedWrite"> & {
386
+ /**
387
+ * The shortest and longest lease, in seconds, the device accepts. Absent: no bound on
388
+ * that side, never zero. A lease outside them is refused rather than clamped. Where the
389
+ * device fixes the length itself — a boost time set as a device parameter — the producer
390
+ * states that length as both bounds, so it never accepts a lease it cannot keep.
391
+ *
392
+ * @generated from field: optional uint32 min_lease_seconds = 1;
393
+ */
394
+ minLeaseSeconds?: number | undefined;
395
+
396
+ /**
397
+ * @generated from field: optional uint32 max_lease_seconds = 2;
398
+ */
399
+ maxLeaseSeconds?: number | undefined;
400
+
401
+ /**
402
+ * Whether a write that arrives before the lease runs out starts the lease again from
403
+ * that write. False or unset (not stated): a writer MUST NOT assume that writing the
404
+ * same value again extends how long it holds.
405
+ *
406
+ * @generated from field: optional bool renewal_restarts_lease = 3;
407
+ */
408
+ renewalRestartsLease?: boolean | undefined;
409
+
410
+ /**
411
+ * The value the attribute returns to when the lease runs out. It is the state a site
412
+ * falls back to whenever its writer is gone, so it is what an installer checks first and
413
+ * what a consumer shows as "what happens if this stops". A producer always states it; a
414
+ * consumer reads a lease without it as a write kind not stated.
415
+ *
416
+ * A fixed value. A device whose timer returns the output to whatever it held before the
417
+ * write is leased only if its producer guarantees that earlier value is the lapse value
418
+ * — by accepting timed writes only while the output is at its lapse value, or by
419
+ * writing the lapse value untimed before each one — and is otherwise stated sticky.
420
+ *
421
+ * A write of the lapse value itself needs no lease: it ends any lease running, and a
422
+ * lease carried on it is ignored rather than refused. That is how a writer ends a lease
423
+ * early.
424
+ *
425
+ * A report of the lapse value after a lease has run out is the lease ending, not a
426
+ * change from outside: a consumer that adopts values it did not write — a turned dial —
427
+ * MUST NOT adopt that one as a person's.
428
+ *
429
+ * @generated from field: kusinta.iot.device.v1.AttributeValue lapse_value = 4;
430
+ */
431
+ lapseValue?: AttributeValue | undefined;
432
+ };
433
+
434
+ /**
435
+ * Describes the message kusinta.iot.device.v1.LeasedWrite.
436
+ * Use `create(LeasedWriteSchema)` to create a new message.
437
+ */
438
+ export declare const LeasedWriteSchema: GenMessage<LeasedWrite>;
439
+
440
+ /**
441
+ * How late a reported value reaches the producer after it changes at the device.
442
+ *
443
+ * @generated from enum kusinta.iot.device.v1.ReadLatency
444
+ */
445
+ export enum ReadLatency {
446
+ /**
447
+ * Not stated. Never treated as REAL_TIME.
448
+ *
449
+ * @generated from enum value: READ_LATENCY_UNSPECIFIED = 0;
450
+ */
451
+ UNSPECIFIED = 0,
452
+
453
+ /**
454
+ * Within a few minutes of the change, every time. A value relayed through a vendor's
455
+ * service is not stated REAL_TIME unless that has been measured.
456
+ *
457
+ * @generated from enum value: READ_LATENCY_REAL_TIME = 1;
458
+ */
459
+ REAL_TIME = 1,
460
+
461
+ /**
462
+ * Late enough that acting on it as current would be wrong: values collected by a
463
+ * vendor's service and handed on in batches, hourly values made available the next day.
464
+ * Fit for records, models and reports; not for a decision that has to be made now.
465
+ *
466
+ * @generated from enum value: READ_LATENCY_DELAYED = 2;
467
+ */
468
+ DELAYED = 2,
469
+ }
470
+
471
+ /**
472
+ * Describes the enum kusinta.iot.device.v1.ReadLatency.
473
+ */
474
+ export declare const ReadLatencySchema: GenEnum<ReadLatency>;
475
+
@@ -2,13 +2,13 @@
2
2
  // @generated from file kusinta/iot/device/v1/cluster_state.proto (package kusinta.iot.device.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
5
+ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
6
 
7
7
  /**
8
8
  * Describes the file kusinta/iot/device/v1/cluster_state.proto.
9
9
  */
10
10
  export const file_kusinta_iot_device_v1_cluster_state = /*@__PURE__*/
11
- fileDesc("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUi+QIKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA0SFQoNYXR0cmlidXRlX2lkcxgGIAMoDRJQCg9hdHRyaWJ1dGVfc3RlcHMYByADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlLkF0dHJpYnV0ZVN0ZXBzRW50cnkaNQoTQXR0cmlidXRlU3RlcHNFbnRyeRILCgNrZXkYASABKA0SDQoFdmFsdWUYAiABKA06AjgBQhMKEV9jbHVzdGVyX3JldmlzaW9uQg4KDF9mZWF0dXJlX21hcEICSAFiBnByb3RvMw");
11
+ fileDesc("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUivAQKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA0SFQoNYXR0cmlidXRlX2lkcxgGIAMoDRJQCg9hdHRyaWJ1dGVfc3RlcHMYByADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlLkF0dHJpYnV0ZVN0ZXBzRW50cnkSWgoUYXR0cmlidXRlX2JlaGF2aW91cnMYCCADKAsyPC5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlLkF0dHJpYnV0ZUJlaGF2aW91cnNFbnRyeRo1ChNBdHRyaWJ1dGVTdGVwc0VudHJ5EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEoDToCOAEaZQoYQXR0cmlidXRlQmVoYXZpb3Vyc0VudHJ5EgsKA2tleRgBIAEoDRI4CgV2YWx1ZRgCIAEoCzIpLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVCZWhhdmlvdXI6AjgBQhMKEV9jbHVzdGVyX3JldmlzaW9uQg4KDF9mZWF0dXJlX21hcCKCAgoSQXR0cmlidXRlQmVoYXZpb3VyEjQKBnN0aWNreRgBIAEoCzIiLmt1c2ludGEuaW90LmRldmljZS52MS5TdGlja3lXcml0ZUgAEjQKBmxlYXNlZBgCIAEoCzIiLmt1c2ludGEuaW90LmRldmljZS52MS5MZWFzZWRXcml0ZUgAEj0KDnBvd2VyX29uX3ZhbHVlGAMgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlEjgKDHJlYWRfbGF0ZW5jeRgEIAEoDjIiLmt1c2ludGEuaW90LmRldmljZS52MS5SZWFkTGF0ZW5jeUIHCgV3cml0ZSINCgtTdGlja3lXcml0ZSL1AQoLTGVhc2VkV3JpdGUSHgoRbWluX2xlYXNlX3NlY29uZHMYASABKA1IAIgBARIeChFtYXhfbGVhc2Vfc2Vjb25kcxgCIAEoDUgBiAEBEiMKFnJlbmV3YWxfcmVzdGFydHNfbGVhc2UYAyABKAhIAogBARI6CgtsYXBzZV92YWx1ZRgEIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZUIUChJfbWluX2xlYXNlX3NlY29uZHNCFAoSX21heF9sZWFzZV9zZWNvbmRzQhkKF19yZW5ld2FsX3Jlc3RhcnRzX2xlYXNlKmEKC1JlYWRMYXRlbmN5EhwKGFJFQURfTEFURU5DWV9VTlNQRUNJRklFRBAAEhoKFlJFQURfTEFURU5DWV9SRUFMX1RJTUUQARIYChRSRUFEX0xBVEVOQ1lfREVMQVlFRBACQgJIAWIGcHJvdG8z");
12
12
 
13
13
  /**
14
14
  * Describes the message kusinta.iot.device.v1.NullValue.
@@ -52,3 +52,38 @@ export const AttributeStateSchema = /*@__PURE__*/
52
52
  export const ClusterStateSchema = /*@__PURE__*/
53
53
  messageDesc(file_kusinta_iot_device_v1_cluster_state, 5);
54
54
 
55
+ /**
56
+ * Describes the message kusinta.iot.device.v1.AttributeBehaviour.
57
+ * Use `create(AttributeBehaviourSchema)` to create a new message.
58
+ */
59
+ export const AttributeBehaviourSchema = /*@__PURE__*/
60
+ messageDesc(file_kusinta_iot_device_v1_cluster_state, 6);
61
+
62
+ /**
63
+ * Describes the message kusinta.iot.device.v1.StickyWrite.
64
+ * Use `create(StickyWriteSchema)` to create a new message.
65
+ */
66
+ export const StickyWriteSchema = /*@__PURE__*/
67
+ messageDesc(file_kusinta_iot_device_v1_cluster_state, 7);
68
+
69
+ /**
70
+ * Describes the message kusinta.iot.device.v1.LeasedWrite.
71
+ * Use `create(LeasedWriteSchema)` to create a new message.
72
+ */
73
+ export const LeasedWriteSchema = /*@__PURE__*/
74
+ messageDesc(file_kusinta_iot_device_v1_cluster_state, 8);
75
+
76
+ /**
77
+ * Describes the enum kusinta.iot.device.v1.ReadLatency.
78
+ */
79
+ export const ReadLatencySchema = /*@__PURE__*/
80
+ enumDesc(file_kusinta_iot_device_v1_cluster_state, 0);
81
+
82
+ /**
83
+ * How late a reported value reaches the producer after it changes at the device.
84
+ *
85
+ * @generated from enum kusinta.iot.device.v1.ReadLatency
86
+ */
87
+ export const ReadLatency = /*@__PURE__*/
88
+ tsEnum(ReadLatencySchema);
89
+
@@ -6,7 +6,7 @@ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { ColorTemperatureLightProperties, ContactSensorProperties, DimmableLightProperties, DoorLockProperties, EnergySensorProperties, HumiditySensorProperties, OccupancySensorProperties, OnOffLightProperties, PowerSourceProperties, PressureSensorProperties, TemperatureSensorProperties, ThermostatProperties, WindowCoveringProperties } from "./properties_pb.js";
8
8
  import type { HmMaintenanceProps, HmThermostatProps } from "../../vendor/homematic/v1/homematic_pb.js";
9
- import type { ClusterState } from "./cluster_state_pb.js";
9
+ import type { AttributeBehaviour, ClusterState } from "./cluster_state_pb.js";
10
10
  import type { DeviceDescriptor } from "./descriptor_pb.js";
11
11
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
12
12
 
@@ -230,6 +230,18 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
230
230
  * @generated from field: repeated string vendor_attribute_names = 17;
231
231
  */
232
232
  vendorAttributeNames: string[];
233
+
234
+ /**
235
+ * What a write to each vendor parameter leaves behind, and how late its reports arrive,
236
+ * keyed by the parameter's vendor name as vendor_attribute_names spells it. The vendor
237
+ * mirror of ClusterState.attribute_behaviours, with the same rules: an absent key is
238
+ * "not stated", and not stated is read as the worst case. For a parameter reached through
239
+ * a vendor's service, the name is the vendor's stable parameter id where it has one,
240
+ * never a display name that is translated or renamed between firmware versions.
241
+ *
242
+ * @generated from field: map<string, kusinta.iot.device.v1.AttributeBehaviour> vendor_attribute_behaviours = 18;
243
+ */
244
+ vendorAttributeBehaviours: { [key: string]: AttributeBehaviour };
233
245
  };
234
246
 
235
247
  /**
@@ -261,12 +273,37 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
261
273
  descriptor?: DeviceDescriptor | undefined;
262
274
 
263
275
  /**
264
- * 15-19 are free; 20+ is the timestamp band.
276
+ * 17-19 are free; 20+ is the timestamp band.
265
277
  *
266
278
  * @generated from field: repeated kusinta.iot.device.v1.Endpoint endpoints = 14;
267
279
  */
268
280
  endpoints: Endpoint[];
269
281
 
282
+ /**
283
+ * The fewest seconds this device needs between two writes, to any of its attributes on
284
+ * any endpoint, without dropping one: a radio limited to a share of airtime, a battery
285
+ * device that wakes on a schedule. A device-wide budget rather than a per-attribute one,
286
+ * because two attributes each written at their own pace still share one radio. Stated by
287
+ * the producer at announcement. Absent: not stated, never zero.
288
+ *
289
+ * A lower bound, not the whole budget: devices behind one radio gateway or one hub share
290
+ * its airtime, and a vendor's service limits an account rather than a device, so a writer
291
+ * may have to space writes further apart than this says.
292
+ *
293
+ * @generated from field: optional uint32 min_write_interval_seconds = 15;
294
+ */
295
+ minWriteIntervalSeconds?: number | undefined;
296
+
297
+ /**
298
+ * The longest a write can take to reach the device: a device that listens only after
299
+ * its own report takes a write at its next one. Stated by the producer at announcement.
300
+ * Absent: not stated, never zero. A writer that renews a lease renews it this long, plus
301
+ * a margin, before the lease runs out, or the output lapses between renewals.
302
+ *
303
+ * @generated from field: optional uint32 max_write_delay_seconds = 16;
304
+ */
305
+ maxWriteDelaySeconds?: number | undefined;
306
+
270
307
  /**
271
308
  * When the gateway last had evidence this device itself — the
272
309
  * most recent PropertyUpdate (wheter or not the property changed) or command
@@ -14,7 +14,7 @@ import { file_kusinta_iot_vendor_v1_vendor_options } from "../../vendor/v1/vendo
14
14
  * Describes the file kusinta/iot/device/v1/device.proto.
15
15
  */
16
16
  export const file_kusinta_iot_device_v1_device = /*@__PURE__*/
17
- fileDesc("CiJrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEi0woKCEVuZHBvaW50EhMKC2VuZHBvaW50X2lkGAEgASgNEh0KFW1hdHRlcl9kZXZpY2VfdHlwZV9pZBgCIAEoDRJBCgp0aGVybW9zdGF0GAMgASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRoZXJtb3N0YXRQcm9wZXJ0aWVzSAASUAoSdGVtcGVyYXR1cmVfc2Vuc29yGAQgASgLMjIua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllc0gAEkoKD2h1bWlkaXR5X3NlbnNvchgFIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5IdW1pZGl0eVNlbnNvclByb3BlcnRpZXNIABJMChBvY2N1cGFuY3lfc2Vuc29yGAYgASgLMjAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXNIABJICg5jb250YWN0X3NlbnNvchgHIAEoCzIuLmt1c2ludGEuaW90LmRldmljZS52MS5Db250YWN0U2Vuc29yUHJvcGVydGllc0gAEkoKD3dpbmRvd19jb3ZlcmluZxgIIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5XaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXNIABI+Cglkb29yX2xvY2sYCSABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRG9vckxvY2tQcm9wZXJ0aWVzSAASQwoMb25fb2ZmX2xpZ2h0GAogASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9uT2ZmTGlnaHRQcm9wZXJ0aWVzSAASSAoOZGltbWFibGVfbGlnaHQYCyABKAsyLi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGltbWFibGVMaWdodFByb3BlcnRpZXNIABJSChBjb2xvcl90ZW1wX2xpZ2h0GAwgASgLMjYua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNvbG9yVGVtcGVyYXR1cmVMaWdodFByb3BlcnRpZXNIABJGCg1lbmVyZ3lfc2Vuc29yGA0gASgLMi0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkVuZXJneVNlbnNvclByb3BlcnRpZXNIABJKCg9wcmVzc3VyZV9zZW5zb3IYDiABKAsyLy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJlc3N1cmVTZW5zb3JQcm9wZXJ0aWVzSAASRAoMcG93ZXJfc291cmNlGA8gASgLMiwua3VzaW50YS5pb3QuZGV2aWNlLnYxLlBvd2VyU291cmNlUHJvcGVydGllc0gAEksKDWhtX3RoZXJtb3N0YXQYMiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtVGhlcm1vc3RhdFByb3BzSAESTQoOaG1fbWFpbnRlbmFuY2UYMyABKAsyMy5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtTWFpbnRlbmFuY2VQcm9wc0gBEjQKCnJhZGlvX2xpbmsYNCABKAsyIC5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUmFkaW9MaW5rEjUKCGNsdXN0ZXJzGBAgAygLMiMua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNsdXN0ZXJTdGF0ZRIeChZ2ZW5kb3JfYXR0cmlidXRlX25hbWVzGBEgAygJQhMKEW1hdHRlcl9wcm9wZXJ0aWVzQhMKEXZlbmRvcl9wcm9wZXJ0aWVzIrADCgZEZXZpY2USOwoKZGVzY3JpcHRvchgBIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VEZXNjcmlwdG9yEjIKCWVuZHBvaW50cxgOIAMoCzIfLmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludBItCglsYXN0X3NlZW4YFCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjAKDGxhc3RfdXBkYXRlZBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBKBAgCEA5KBAgyEDNSCnRoZXJtb3N0YXRSEnRlbXBlcmF0dXJlX3NlbnNvclIPaHVtaWRpdHlfc2Vuc29yUhBvY2N1cGFuY3lfc2Vuc29yUg5jb250YWN0X3NlbnNvclIPd2luZG93X2NvdmVyaW5nUglkb29yX2xvY2tSDG9uX29mZl9saWdodFIOZGltbWFibGVfbGlnaHRSEGNvbG9yX3RlbXBfbGlnaHRSDWVuZXJneV9zZW5zb3JSD3ByZXNzdXJlX3NlbnNvclIJaG9tZW1hdGljIrcBCglSYWRpb0xpbmsSJQoHcXVhbGl0eRgBIAEoDUIPorUYB3F1YWxpdHnQtRgFSACIAQESJwoIcnNzaV9kYm0YAiABKBFCEKK1GAhyc3NpX2RibdC1GAVIAYgBARIjCgZzbnJfZGIYAyABKAJCDqK1GAZzbnJfZGLQtRgFSAKIAQE6Eaq1GA1rdXNpbnRhLnJhZGlvQgoKCF9xdWFsaXR5QgsKCV9yc3NpX2RibUIJCgdfc25yX2RiKnUKDFJhZGlvUXVhbGl0eRIdChlSQURJT19RVUFMSVRZX1VOU1BFQ0lGSUVEEAASFgoSUkFESU9fUVVBTElUWV9HT09EEAESFgoSUkFESU9fUVVBTElUWV9GQUlSEAISFgoSUkFESU9fUVVBTElUWV9QT09SEANCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_descriptor, file_kusinta_iot_device_v1_properties, file_kusinta_iot_vendor_homematic_v1_homematic, file_kusinta_iot_vendor_v1_vendor_options]);
17
+ fileDesc("CiJrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEipQwKCEVuZHBvaW50EhMKC2VuZHBvaW50X2lkGAEgASgNEh0KFW1hdHRlcl9kZXZpY2VfdHlwZV9pZBgCIAEoDRJBCgp0aGVybW9zdGF0GAMgASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRoZXJtb3N0YXRQcm9wZXJ0aWVzSAASUAoSdGVtcGVyYXR1cmVfc2Vuc29yGAQgASgLMjIua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllc0gAEkoKD2h1bWlkaXR5X3NlbnNvchgFIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5IdW1pZGl0eVNlbnNvclByb3BlcnRpZXNIABJMChBvY2N1cGFuY3lfc2Vuc29yGAYgASgLMjAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXNIABJICg5jb250YWN0X3NlbnNvchgHIAEoCzIuLmt1c2ludGEuaW90LmRldmljZS52MS5Db250YWN0U2Vuc29yUHJvcGVydGllc0gAEkoKD3dpbmRvd19jb3ZlcmluZxgIIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5XaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXNIABI+Cglkb29yX2xvY2sYCSABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRG9vckxvY2tQcm9wZXJ0aWVzSAASQwoMb25fb2ZmX2xpZ2h0GAogASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9uT2ZmTGlnaHRQcm9wZXJ0aWVzSAASSAoOZGltbWFibGVfbGlnaHQYCyABKAsyLi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGltbWFibGVMaWdodFByb3BlcnRpZXNIABJSChBjb2xvcl90ZW1wX2xpZ2h0GAwgASgLMjYua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNvbG9yVGVtcGVyYXR1cmVMaWdodFByb3BlcnRpZXNIABJGCg1lbmVyZ3lfc2Vuc29yGA0gASgLMi0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkVuZXJneVNlbnNvclByb3BlcnRpZXNIABJKCg9wcmVzc3VyZV9zZW5zb3IYDiABKAsyLy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJlc3N1cmVTZW5zb3JQcm9wZXJ0aWVzSAASRAoMcG93ZXJfc291cmNlGA8gASgLMiwua3VzaW50YS5pb3QuZGV2aWNlLnYxLlBvd2VyU291cmNlUHJvcGVydGllc0gAEksKDWhtX3RoZXJtb3N0YXQYMiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtVGhlcm1vc3RhdFByb3BzSAESTQoOaG1fbWFpbnRlbmFuY2UYMyABKAsyMy5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtTWFpbnRlbmFuY2VQcm9wc0gBEjQKCnJhZGlvX2xpbmsYNCABKAsyIC5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUmFkaW9MaW5rEjUKCGNsdXN0ZXJzGBAgAygLMiMua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNsdXN0ZXJTdGF0ZRIeChZ2ZW5kb3JfYXR0cmlidXRlX25hbWVzGBEgAygJEmMKG3ZlbmRvcl9hdHRyaWJ1dGVfYmVoYXZpb3VycxgSIAMoCzI+Lmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludC5WZW5kb3JBdHRyaWJ1dGVCZWhhdmlvdXJzRW50cnkaawoeVmVuZG9yQXR0cmlidXRlQmVoYXZpb3Vyc0VudHJ5EgsKA2tleRgBIAEoCRI4CgV2YWx1ZRgCIAEoCzIpLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVCZWhhdmlvdXI6AjgBQhMKEW1hdHRlcl9wcm9wZXJ0aWVzQhMKEXZlbmRvcl9wcm9wZXJ0aWVzIroECgZEZXZpY2USOwoKZGVzY3JpcHRvchgBIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VEZXNjcmlwdG9yEjIKCWVuZHBvaW50cxgOIAMoCzIfLmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludBInChptaW5fd3JpdGVfaW50ZXJ2YWxfc2Vjb25kcxgPIAEoDUgAiAEBEiQKF21heF93cml0ZV9kZWxheV9zZWNvbmRzGBAgASgNSAGIAQESLQoJbGFzdF9zZWVuGBQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIwCgxsYXN0X3VwZGF0ZWQYFSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQh0KG19taW5fd3JpdGVfaW50ZXJ2YWxfc2Vjb25kc0IaChhfbWF4X3dyaXRlX2RlbGF5X3NlY29uZHNKBAgCEA5KBAgyEDNSCnRoZXJtb3N0YXRSEnRlbXBlcmF0dXJlX3NlbnNvclIPaHVtaWRpdHlfc2Vuc29yUhBvY2N1cGFuY3lfc2Vuc29yUg5jb250YWN0X3NlbnNvclIPd2luZG93X2NvdmVyaW5nUglkb29yX2xvY2tSDG9uX29mZl9saWdodFIOZGltbWFibGVfbGlnaHRSEGNvbG9yX3RlbXBfbGlnaHRSDWVuZXJneV9zZW5zb3JSD3ByZXNzdXJlX3NlbnNvclIJaG9tZW1hdGljIrcBCglSYWRpb0xpbmsSJQoHcXVhbGl0eRgBIAEoDUIPorUYB3F1YWxpdHnQtRgFSACIAQESJwoIcnNzaV9kYm0YAiABKBFCEKK1GAhyc3NpX2RibdC1GAVIAYgBARIjCgZzbnJfZGIYAyABKAJCDqK1GAZzbnJfZGLQtRgFSAKIAQE6Eaq1GA1rdXNpbnRhLnJhZGlvQgoKCF9xdWFsaXR5QgsKCV9yc3NpX2RibUIJCgdfc25yX2RiKnUKDFJhZGlvUXVhbGl0eRIdChlSQURJT19RVUFMSVRZX1VOU1BFQ0lGSUVEEAASFgoSUkFESU9fUVVBTElUWV9HT09EEAESFgoSUkFESU9fUVVBTElUWV9GQUlSEAISFgoSUkFESU9fUVVBTElUWV9QT09SEANCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_descriptor, file_kusinta_iot_device_v1_properties, file_kusinta_iot_vendor_homematic_v1_homematic, file_kusinta_iot_vendor_v1_vendor_options]);
18
18
 
19
19
  /**
20
20
  * Describes the message kusinta.iot.device.v1.Endpoint.
@@ -281,6 +281,16 @@ export declare type DeviceCommand = Message<"kusinta.iot.webrtc.v1.DeviceCommand
281
281
  value: Uint8Array;
282
282
  case: "rawTlv";
283
283
  } | { case: undefined; value?: undefined };
284
+
285
+ /**
286
+ * How long, in seconds, the value the command sets holds, for a command that sets an
287
+ * attribute the producer states as leased: OnOff is set by the On and Off commands, not
288
+ * by a write. The same rules as AttributeWriteRequest.lease_seconds, applied to the
289
+ * attribute the command sets.
290
+ *
291
+ * @generated from field: optional uint32 lease_seconds = 14;
292
+ */
293
+ leaseSeconds?: number | undefined;
284
294
  };
285
295
 
286
296
  /**
@@ -434,6 +444,28 @@ export declare type AttributeWriteRequest = Message<"kusinta.iot.webrtc.v1.Attri
434
444
  * @generated from field: kusinta.iot.device.v1.AttributeValue value = 4;
435
445
  */
436
446
  value?: AttributeValue | undefined;
447
+
448
+ /**
449
+ * How long, in seconds, the written value holds before the device itself returns the
450
+ * attribute to its lapse value — for an attribute the producer states as leased
451
+ * (device.v1.LeasedWrite, on the attribute's cluster or as a vendor parameter). At least
452
+ * one second, and within the stated minimum and maximum.
453
+ *
454
+ * The producer MUST refuse, with COMMAND_ERROR_CODE_INVALID_COMMAND, a write to a leased
455
+ * attribute that carries no lease, a lease of zero or outside the stated bounds, and a
456
+ * lease on an attribute it does not state as leased. A write of the attribute's lapse
457
+ * value is the exception: it needs no lease, ends any lease running, and a lease on it
458
+ * is ignored (device.v1.LeasedWrite.lapse_value). Rollout order: a writer sends a
459
+ * lease for an attribute before the attribute's producer states it as leased.
460
+ *
461
+ * Set only by the gateway, towards a producer: a leased attribute is written by the
462
+ * gateway alone. A gateway MUST refuse a request from an app that carries a lease, with
463
+ * COMMAND_ERROR_CODE_INVALID_COMMAND, and an app's write or command to an attribute its
464
+ * producer states as leased, with COMMAND_ERROR_CODE_HELD_BY_GATEWAY.
465
+ *
466
+ * @generated from field: optional uint32 lease_seconds = 5;
467
+ */
468
+ leaseSeconds?: number | undefined;
437
469
  };
438
470
 
439
471
  /**
@@ -514,6 +546,16 @@ export enum CommandErrorCode {
514
546
  * @generated from enum value: COMMAND_ERROR_CODE_INTERNAL = 7;
515
547
  */
516
548
  INTERNAL = 7,
549
+
550
+ /**
551
+ * The attribute is one the gateway drives under a lease — a floor zone, a heat source's
552
+ * add-on heater block — and a person changes it through the room's target and comfort
553
+ * band, not directly. Permanent for this attribute: do not retry; tell the user where to
554
+ * change it instead.
555
+ *
556
+ * @generated from enum value: COMMAND_ERROR_CODE_HELD_BY_GATEWAY = 8;
557
+ */
558
+ HELD_BY_GATEWAY = 8,
517
559
  }
518
560
 
519
561
  /**
@@ -14,7 +14,7 @@ import { file_kusinta_iot_webrtc_v1_setpoint_mode } from "./setpoint_mode_pb.js"
14
14
  * Describes the file kusinta/iot/webrtc/v1/command.proto.
15
15
  */
16
16
  export const file_kusinta_iot_webrtc_v1_command = /*@__PURE__*/
17
- fileDesc("CiNrdXNpbnRhL2lvdC93ZWJydGMvdjEvY29tbWFuZC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxInwKGFRoZXJtb3N0YXRTZXRwb2ludFBhcmFtcxI8CgRtb2RlGAEgASgOMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldHBvaW50QWRqdXN0TW9kZUgAiAEBEg4KBmFtb3VudBgCIAEoEToJuLUYgQTAtRgAQgcKBV9tb2RlIkYKEkxldmVsQ29udHJvbFBhcmFtcxINCgVsZXZlbBgBIAEoDRIXCg90cmFuc2l0aW9uX3RpbWUYAiABKA06CLi1GAjAtRgAIisKC09uT2ZmUGFyYW1zOgS4tRgGSgQIARACSgQIAhADUgJvblIGdG9nZ2xlIkEKGFdpbmRvd0NvdmVyaW5nTGlmdFBhcmFtcxIaChJsaWZ0X3BlcmNlbnQxMDB0aHMYASABKA06Cbi1GIICwLUYBSI7Cg5Eb29yTG9ja1BhcmFtcxIQCghwaW5fY29kZRgCIAEoCToFuLUYgQJKBAgBEAJSCmxvY2tfc3RhdGUikgUKDURldmljZUNvbW1hbmQSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIUCgxjb21tYW5kX25hbWUYBCABKAkSEgoKY2x1c3Rlcl9pZBgMIAEoDRIeChFtYXR0ZXJfY29tbWFuZF9pZBgNIAEoDUgBiAEBEhgKC2VuZHBvaW50X2lkGAsgASgNSAKIAQESTgoTdGhlcm1vc3RhdF9zZXRwb2ludBgFIAEoCzIvLmt1c2ludGEuaW90LndlYnJ0Yy52MS5UaGVybW9zdGF0U2V0cG9pbnRQYXJhbXNIABJCCg1sZXZlbF9jb250cm9sGAYgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkxldmVsQ29udHJvbFBhcmFtc0gAEjQKBm9uX29mZhgHIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Pbk9mZlBhcmFtc0gAEk8KFHdpbmRvd19jb3ZlcmluZ19saWZ0GAggASgLMi8ua3VzaW50YS5pb3Qud2VicnRjLnYxLldpbmRvd0NvdmVyaW5nTGlmdFBhcmFtc0gAEjoKCWRvb3JfbG9jaxgJIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Eb29yTG9ja1BhcmFtc0gAEhEKB3Jhd190bHYYYyABKAxIAEIMCgpwYXJhbWV0ZXJzQhQKEl9tYXR0ZXJfY29tbWFuZF9pZEIOCgxfZW5kcG9pbnRfaWRKBAgDEARKBAgKEAtSDmNsdXN0ZXJfaWRfaGV4Uhl0aGVybW9zdGF0X3NldHBvaW50X3dyaXRlItIBCgxDb21tYW5kRXJyb3ISDwoHbWVzc2FnZRgCIAEoCRI1CgRjb2RlGAMgASgOMicua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbW1hbmRFcnJvckNvZGUSQwoIbWV0YWRhdGEYBCADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBSgQIARACIt4BCg1Db21tYW5kUmVzdWx0EhIKCnJlcXVlc3RfaWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIyCgVlcnJvchgDIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kRXJyb3ISMAoMY29tcGxldGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIzCgpzZXR0bGVzX2J5GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBQg0KC19zZXR0bGVzX2J5IswBChVBdHRyaWJ1dGVXcml0ZVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYAyABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEjQKBXZhbHVlGAQgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlKr8CChBDb21tYW5kRXJyb3JDb2RlEiIKHkNPTU1BTkRfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEiMKH0NPTU1BTkRfRVJST1JfQ09ERV9OT1RfRU5USVRMRUQQARIqCiZDT01NQU5EX0VSUk9SX0NPREVfQ09OU1RSQUlOVF9WSU9MQVRFRBACEiYKIkNPTU1BTkRfRVJST1JfQ09ERV9JTlZBTElEX0NPTU1BTkQQAxIiCh5DT01NQU5EX0VSUk9SX0NPREVfVU5SRUFDSEFCTEUQBBIeChpDT01NQU5EX0VSUk9SX0NPREVfVElNRU9VVBAFEikKJUNPTU1BTkRfRVJST1JfQ09ERV9SRUpFQ1RFRF9CWV9ERVZJQ0UQBhIfChtDT01NQU5EX0VSUk9SX0NPREVfSU5URVJOQUwQB0ICSAFiBnByb3RvMw", [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
+ fileDesc("CiNrdXNpbnRhL2lvdC93ZWJydGMvdjEvY29tbWFuZC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxInwKGFRoZXJtb3N0YXRTZXRwb2ludFBhcmFtcxI8CgRtb2RlGAEgASgOMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldHBvaW50QWRqdXN0TW9kZUgAiAEBEg4KBmFtb3VudBgCIAEoEToJuLUYgQTAtRgAQgcKBV9tb2RlIkYKEkxldmVsQ29udHJvbFBhcmFtcxINCgVsZXZlbBgBIAEoDRIXCg90cmFuc2l0aW9uX3RpbWUYAiABKA06CLi1GAjAtRgAIisKC09uT2ZmUGFyYW1zOgS4tRgGSgQIARACSgQIAhADUgJvblIGdG9nZ2xlIkEKGFdpbmRvd0NvdmVyaW5nTGlmdFBhcmFtcxIaChJsaWZ0X3BlcmNlbnQxMDB0aHMYASABKA06Cbi1GIICwLUYBSI7Cg5Eb29yTG9ja1BhcmFtcxIQCghwaW5fY29kZRgCIAEoCToFuLUYgQJKBAgBEAJSCmxvY2tfc3RhdGUiwAUKDURldmljZUNvbW1hbmQSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIUCgxjb21tYW5kX25hbWUYBCABKAkSEgoKY2x1c3Rlcl9pZBgMIAEoDRIeChFtYXR0ZXJfY29tbWFuZF9pZBgNIAEoDUgBiAEBEhgKC2VuZHBvaW50X2lkGAsgASgNSAKIAQESTgoTdGhlcm1vc3RhdF9zZXRwb2ludBgFIAEoCzIvLmt1c2ludGEuaW90LndlYnJ0Yy52MS5UaGVybW9zdGF0U2V0cG9pbnRQYXJhbXNIABJCCg1sZXZlbF9jb250cm9sGAYgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkxldmVsQ29udHJvbFBhcmFtc0gAEjQKBm9uX29mZhgHIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Pbk9mZlBhcmFtc0gAEk8KFHdpbmRvd19jb3ZlcmluZ19saWZ0GAggASgLMi8ua3VzaW50YS5pb3Qud2VicnRjLnYxLldpbmRvd0NvdmVyaW5nTGlmdFBhcmFtc0gAEjoKCWRvb3JfbG9jaxgJIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Eb29yTG9ja1BhcmFtc0gAEhEKB3Jhd190bHYYYyABKAxIABIaCg1sZWFzZV9zZWNvbmRzGA4gASgNSAOIAQFCDAoKcGFyYW1ldGVyc0IUChJfbWF0dGVyX2NvbW1hbmRfaWRCDgoMX2VuZHBvaW50X2lkQhAKDl9sZWFzZV9zZWNvbmRzSgQIAxAESgQIChALUg5jbHVzdGVyX2lkX2hleFIZdGhlcm1vc3RhdF9zZXRwb2ludF93cml0ZSLSAQoMQ29tbWFuZEVycm9yEg8KB21lc3NhZ2UYAiABKAkSNQoEY29kZRgDIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kRXJyb3JDb2RlEkMKCG1ldGFkYXRhGAQgAygLMjEua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbW1hbmRFcnJvci5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUoECAEQAiLeAQoNQ29tbWFuZFJlc3VsdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMgoFZXJyb3IYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yEjAKDGNvbXBsZXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMwoKc2V0dGxlc19ieRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfc2V0dGxlc19ieSL6AQoVQXR0cmlidXRlV3JpdGVSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSNAoJZGV2aWNlX2lkGAIgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSMwoGdGFyZ2V0GAMgASgLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhI0CgV2YWx1ZRgEIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZRIaCg1sZWFzZV9zZWNvbmRzGAUgASgNSACIAQFCEAoOX2xlYXNlX3NlY29uZHMq5wIKEENvbW1hbmRFcnJvckNvZGUSIgoeQ09NTUFORF9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASIwofQ09NTUFORF9FUlJPUl9DT0RFX05PVF9FTlRJVExFRBABEioKJkNPTU1BTkRfRVJST1JfQ09ERV9DT05TVFJBSU5UX1ZJT0xBVEVEEAISJgoiQ09NTUFORF9FUlJPUl9DT0RFX0lOVkFMSURfQ09NTUFORBADEiIKHkNPTU1BTkRfRVJST1JfQ09ERV9VTlJFQUNIQUJMRRAEEh4KGkNPTU1BTkRfRVJST1JfQ09ERV9USU1FT1VUEAUSKQolQ09NTUFORF9FUlJPUl9DT0RFX1JFSkVDVEVEX0JZX0RFVklDRRAGEh8KG0NPTU1BTkRfRVJST1JfQ09ERV9JTlRFUk5BTBAHEiYKIkNPTU1BTkRfRVJST1JfQ09ERV9IRUxEX0JZX0dBVEVXQVkQCEICSAFiBnByb3RvMw", [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]);
18
18
 
19
19
  /**
20
20
  * Describes the message kusinta.iot.webrtc.v1.ThermostatSetpointParams.