@camstack/addon-provider-homematic 1.2.77 → 1.2.79

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/dist/addon.js CHANGED
@@ -7960,13 +7960,28 @@ var RecordingBandSchema = object({
7960
7960
  end: string().regex(HHMM),
7961
7961
  mode: RecordingBandModeSchema,
7962
7962
  triggers: RecordingBandTriggersSchema.optional(),
7963
+ /**
7964
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
7965
+ *
7966
+ * It was the retroactive KEEP bound — which already-written segments survive
7967
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
7968
+ * broker could serve, or the gate would delete the seconds the ring had just
7969
+ * handed the writer. That "at least as wide as" is the tell: it was a second
7970
+ * expression of the broker's retention, in different units, in a different
7971
+ * addon, with an invariant the operator had to maintain by hand. The keep
7972
+ * bound is now derived from the one prebuffer ceiling and there is nothing
7973
+ * left to configure here.
7974
+ *
7975
+ * The key survives in the SHAPE so a config written before that record still
7976
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
7977
+ * strict, so simply deleting it would strip an operator's value in silence on
7978
+ * the next save (the failure D380 came one commit from shipping). Nothing
7979
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
7980
+ */
7963
7981
  preBufferSec: number().min(0).optional(),
7964
7982
  postBufferSec: number().min(0).optional()
7965
7983
  });
7966
- ({
7967
- preBufferSec: 15,
7968
- postBufferSec: 30
7969
- }).postBufferSec * 1e3;
7984
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
7970
7985
  /**
7971
7986
  * Per-device retention overrides. Every field is optional; an unset or `0`
7972
7987
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10543,12 +10558,30 @@ var BackupDestinationInfoSchema = object({
10543
10558
  lastSuccessAt: number().optional(),
10544
10559
  /** Newest-archive size from `manifests.json`, or undefined. */
10545
10560
  lastSuccessSizeBytes: number().optional(),
10546
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10561
+ /**
10562
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10563
+ * destination, comma-joined. Absent when no enabled schedule targets it
10564
+ * — a destination nothing is scheduled to write to must not advertise a
10565
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10566
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10567
+ * and reading it made a destination with a DISABLED schedule claim a
10568
+ * nightly run.
10569
+ */
10547
10570
  cron: string().optional(),
10548
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10571
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10549
10572
  nextRunAt: number().optional(),
10550
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10551
- lastRunAt: number().optional()
10573
+ /**
10574
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10575
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10576
+ * newest archive that actually landed) and `lastError`.
10577
+ */
10578
+ lastAttemptAt: number().optional(),
10579
+ /**
10580
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10581
+ * landed the archive. A destination that has never been written to has
10582
+ * neither this nor `lastAttemptAt`.
10583
+ */
10584
+ lastError: string().optional()
10552
10585
  });
10553
10586
  /**
10554
10587
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10711,8 +10744,16 @@ var BackupScheduleSchema = object({
10711
10744
  retentionCount: number().int().min(1).max(1e3),
10712
10745
  /** Optional subset of source locations to include; omitted = all. */
10713
10746
  dataSources: array(string()).readonly().optional(),
10714
- /** ms-epoch of last successful run. */
10715
- lastRunAt: number().optional(),
10747
+ /**
10748
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10749
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10750
+ * "succeeded" — a run refused by every destination stamps it too.
10751
+ */
10752
+ lastAttemptAt: number().optional(),
10753
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10754
+ lastSuccessAt: number().optional(),
10755
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10756
+ lastError: string().optional(),
10716
10757
  /** ms-epoch of next computed firing (read-only, filled on list). */
10717
10758
  nextRunAt: number().optional()
10718
10759
  });
@@ -10761,14 +10802,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10761
10802
  locationId: string(),
10762
10803
  enabled: boolean(),
10763
10804
  retentionCount: number().int().min(1).max(1e3),
10764
- label: string().optional(),
10765
- /**
10766
- * Per-destination cron expression. Empty string clears the
10767
- * schedule (manual-only). Validated server-side via croner;
10768
- * malformed expressions reject the upsert with an actionable
10769
- * message.
10770
- */
10771
- cron: string().optional()
10805
+ label: string().optional()
10772
10806
  }), _void(), {
10773
10807
  kind: "mutation",
10774
10808
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -7961,13 +7961,28 @@ var RecordingBandSchema = object({
7961
7961
  end: string().regex(HHMM),
7962
7962
  mode: RecordingBandModeSchema,
7963
7963
  triggers: RecordingBandTriggersSchema.optional(),
7964
+ /**
7965
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
7966
+ *
7967
+ * It was the retroactive KEEP bound — which already-written segments survive
7968
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
7969
+ * broker could serve, or the gate would delete the seconds the ring had just
7970
+ * handed the writer. That "at least as wide as" is the tell: it was a second
7971
+ * expression of the broker's retention, in different units, in a different
7972
+ * addon, with an invariant the operator had to maintain by hand. The keep
7973
+ * bound is now derived from the one prebuffer ceiling and there is nothing
7974
+ * left to configure here.
7975
+ *
7976
+ * The key survives in the SHAPE so a config written before that record still
7977
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
7978
+ * strict, so simply deleting it would strip an operator's value in silence on
7979
+ * the next save (the failure D380 came one commit from shipping). Nothing
7980
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
7981
+ */
7964
7982
  preBufferSec: number().min(0).optional(),
7965
7983
  postBufferSec: number().min(0).optional()
7966
7984
  });
7967
- ({
7968
- preBufferSec: 15,
7969
- postBufferSec: 30
7970
- }).postBufferSec * 1e3;
7985
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
7971
7986
  /**
7972
7987
  * Per-device retention overrides. Every field is optional; an unset or `0`
7973
7988
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10544,12 +10559,30 @@ var BackupDestinationInfoSchema = object({
10544
10559
  lastSuccessAt: number().optional(),
10545
10560
  /** Newest-archive size from `manifests.json`, or undefined. */
10546
10561
  lastSuccessSizeBytes: number().optional(),
10547
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10562
+ /**
10563
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10564
+ * destination, comma-joined. Absent when no enabled schedule targets it
10565
+ * — a destination nothing is scheduled to write to must not advertise a
10566
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10567
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10568
+ * and reading it made a destination with a DISABLED schedule claim a
10569
+ * nightly run.
10570
+ */
10548
10571
  cron: string().optional(),
10549
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10572
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10550
10573
  nextRunAt: number().optional(),
10551
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10552
- lastRunAt: number().optional()
10574
+ /**
10575
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10576
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10577
+ * newest archive that actually landed) and `lastError`.
10578
+ */
10579
+ lastAttemptAt: number().optional(),
10580
+ /**
10581
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10582
+ * landed the archive. A destination that has never been written to has
10583
+ * neither this nor `lastAttemptAt`.
10584
+ */
10585
+ lastError: string().optional()
10553
10586
  });
10554
10587
  /**
10555
10588
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10712,8 +10745,16 @@ var BackupScheduleSchema = object({
10712
10745
  retentionCount: number().int().min(1).max(1e3),
10713
10746
  /** Optional subset of source locations to include; omitted = all. */
10714
10747
  dataSources: array(string()).readonly().optional(),
10715
- /** ms-epoch of last successful run. */
10716
- lastRunAt: number().optional(),
10748
+ /**
10749
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10750
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10751
+ * "succeeded" — a run refused by every destination stamps it too.
10752
+ */
10753
+ lastAttemptAt: number().optional(),
10754
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10755
+ lastSuccessAt: number().optional(),
10756
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10757
+ lastError: string().optional(),
10717
10758
  /** ms-epoch of next computed firing (read-only, filled on list). */
10718
10759
  nextRunAt: number().optional()
10719
10760
  });
@@ -10762,14 +10803,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10762
10803
  locationId: string(),
10763
10804
  enabled: boolean(),
10764
10805
  retentionCount: number().int().min(1).max(1e3),
10765
- label: string().optional(),
10766
- /**
10767
- * Per-destination cron expression. Empty string clears the
10768
- * schedule (manual-only). Validated server-side via croner;
10769
- * malformed expressions reject the upsert with an actionable
10770
- * message.
10771
- */
10772
- cron: string().optional()
10806
+ label: string().optional()
10773
10807
  }), _void(), {
10774
10808
  kind: "mutation",
10775
10809
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.77",
3
+ "version": "1.2.79",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",