@operato/twin-kernel 0.7.6 → 0.7.7

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.
@@ -854,6 +854,14 @@ export interface EquipmentState extends EffectivePeriod {
854
854
  minKW?: number;
855
855
  /** switching — 개폐 위치(IEC 61850 `Pos`). 과도·불량을 열림/닫힘으로 반올림하지 않는다. */
856
856
  position?: 'open' | 'closed' | 'intermediate' | 'bad';
857
+ /**
858
+ * 위 값들을 **언제 들었나** — 값과 함께 다녀야 하는 사실.
859
+ *
860
+ * 에너지에서 가장 위험한 화면은 멈춘 값을 지금 값처럼 보여 주는 것이다. 통신이 끊긴 설비는 마지막
861
+ * 상태를 그대로 들고 있고, 시각이 없으면 화면은 그것을 「지금」으로 그린다. 값만 적고 시각을
862
+ * 버리면 그 판단을 아무도 할 수 없다.
863
+ */
864
+ measuredAt?: ISOTime;
857
865
  /**
858
866
  * 유효 기간 밖이라 이 시각의 모델에 없다 — **네 번째 이유**(§Effectivity).
859
867
  * 도입 예정(`not-yet`)과 폐기(`expired`)를 구별한다. 유효하면 값이 없다.
@@ -212,6 +212,9 @@ export class EmsKernel extends FlowEngine {
212
212
  put('curtailable');
213
213
  put('minKW');
214
214
  put('position');
215
+ /* **값과 함께 시각을 남긴다** — 없으면 화면이 멈춘 값을 지금 값으로 그린다(계량 지점과 같은 규율). */
216
+ if (d?.at)
217
+ eq.measuredAt = d.at;
215
218
  this.revision++;
216
219
  }
217
220
  /** 우리 모델이 모르는 설비가 상태를 보내 온 횟수 — 조용히 버리지 않는다. */
@@ -218,7 +218,7 @@ export function computeOee(c, nowMs) {
218
218
  function energyFieldsOf(m) {
219
219
  const out = {};
220
220
  const src = m;
221
- for (const k of ['generatedKW', 'exportKW', 'soc', 'chargeKW', 'dischargeKW', 'curtailable', 'minKW', 'position']) {
221
+ for (const k of ['generatedKW', 'exportKW', 'soc', 'chargeKW', 'dischargeKW', 'curtailable', 'minKW', 'position', 'measuredAt']) {
222
222
  if (src[k] !== undefined)
223
223
  out[k] = src[k];
224
224
  }
@@ -2800,7 +2800,7 @@ function computeOee(c, nowMs) {
2800
2800
  function energyFieldsOf(m) {
2801
2801
  const out = {};
2802
2802
  const src = m;
2803
- for (const k of ["generatedKW", "exportKW", "soc", "chargeKW", "dischargeKW", "curtailable", "minKW", "position"]) {
2803
+ for (const k of ["generatedKW", "exportKW", "soc", "chargeKW", "dischargeKW", "curtailable", "minKW", "position", "measuredAt"]) {
2804
2804
  if (src[k] !== void 0) out[k] = src[k];
2805
2805
  }
2806
2806
  return out;
@@ -5810,6 +5810,7 @@ var EmsKernel = class extends FlowEngine {
5810
5810
  put("curtailable");
5811
5811
  put("minKW");
5812
5812
  put("position");
5813
+ if (d?.at) eq.measuredAt = d.at;
5813
5814
  this.revision++;
5814
5815
  }
5815
5816
  /** 우리 모델이 모르는 설비가 상태를 보내 온 횟수 — 조용히 버리지 않는다. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operato/twin-kernel",
3
- "version": "0.7.6",
3
+ "version": "0.7.7",
4
4
  "type": "module",
5
5
  "description": "Twin Domain Kernel — framework-agnostic, zero-dep (domain + sim + 3-channel contract). WMS/YMS/MES, EPCIS 2.0 · ISA-95.",
6
6
  "publishConfig": {