@operato/twin-kernel 0.7.72 → 0.7.74
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/capability.d.ts +12 -1
- package/dist/capability.js +1 -1
- package/dist/contract.d.ts +32 -0
- package/dist/ems-kernel.js +5 -0
- package/dist/energy-ingest.d.ts +5 -0
- package/dist/energy-ingest.js +62 -3
- package/dist-cjs/index.cjs +45 -4
- package/package.json +1 -1
package/dist/capability.d.ts
CHANGED
|
@@ -47,8 +47,19 @@ export interface CurtailableState {
|
|
|
47
47
|
curtailable: boolean;
|
|
48
48
|
minKW?: number;
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* 전기 계측 — 전압(V)·전류(A). 전기를 만들거나 쓰는 어떤 설비에서나 같은 모양이다.
|
|
52
|
+
*
|
|
53
|
+
* 발전·저장·개폐 어느 능력에나 붙을 수 있어 따로 둔다. 상별 값은 배열이다(단상이면 원소 하나).
|
|
54
|
+
*/
|
|
55
|
+
export interface ElectricalMeasurementState {
|
|
56
|
+
dcVoltage?: number;
|
|
57
|
+
dcCurrent?: number;
|
|
58
|
+
acVoltage?: number[];
|
|
59
|
+
acCurrent?: number[];
|
|
60
|
+
}
|
|
50
61
|
/** 발전 — 만든다. 역송(`exportKW`)은 소비의 음수가 아니라 별개 사실이다. */
|
|
51
|
-
export interface GeneratingState {
|
|
62
|
+
export interface GeneratingState extends ElectricalMeasurementState {
|
|
52
63
|
generatedKW?: number;
|
|
53
64
|
exportKW?: number;
|
|
54
65
|
generatedKWh?: number;
|
package/dist/capability.js
CHANGED
|
@@ -86,7 +86,7 @@ export const CAPABILITIES = {
|
|
|
86
86
|
* 계량 능력(`metered`)이 `kW` 와 `kWh` 를 함께 선언한 것과 같은 짝이다. 적산은 발전 설비의 보편적
|
|
87
87
|
* 사실이고(태양광·열병합·디젤), 그것이 없으면 성능비·발전시간 같은 성과를 아무도 셀 수 없다.
|
|
88
88
|
*/
|
|
89
|
-
stateFields: ['generatedKW', 'exportKW', 'generatedKWh', 'generatedKWhResetAt', 'generatedKWhSince', 'generatedKWhBasis', 'generatedKWhAccumulation', 'generatedKWhLastPeriod', 'generatedKWhLastPeriodEnd', 'generatedKWhLastPeriodObservedFrom', 'generatedKWhLastPeriodObservedTo'], models: ['GeneratingState'], results: ['generated']
|
|
89
|
+
stateFields: ['generatedKW', 'exportKW', 'generatedKWh', 'generatedKWhResetAt', 'generatedKWhSince', 'generatedKWhBasis', 'generatedKWhAccumulation', 'generatedKWhLastPeriod', 'generatedKWhLastPeriodEnd', 'generatedKWhLastPeriodObservedFrom', 'generatedKWhLastPeriodObservedTo', 'dcVoltage', 'dcCurrent', 'acVoltage', 'acCurrent'], models: ['GeneratingState'], results: ['generated']
|
|
90
90
|
},
|
|
91
91
|
/*
|
|
92
92
|
* ── 왜 `storing` 이 아니라 `energyStoring` 인가 (2026-08-15) ────────────────
|
package/dist/contract.d.ts
CHANGED
|
@@ -1444,6 +1444,14 @@ export interface EquipmentState extends EffectivePeriod {
|
|
|
1444
1444
|
*/
|
|
1445
1445
|
generatedKWhLastPeriodObservedFrom?: ISOTime;
|
|
1446
1446
|
generatedKWhLastPeriodObservedTo?: ISOTime;
|
|
1447
|
+
/**
|
|
1448
|
+
* 전기 계측 — 전압(V)·전류(A). 출력이 0 일 때 **왜 0 인지**를 이 값들이 말한다
|
|
1449
|
+
* (§`EnergyEquipmentData.dcVoltage`).
|
|
1450
|
+
*/
|
|
1451
|
+
dcVoltage?: number;
|
|
1452
|
+
dcCurrent?: number;
|
|
1453
|
+
acVoltage?: number[];
|
|
1454
|
+
acCurrent?: number[];
|
|
1447
1455
|
/** storing — 충전율(%)·충전·방전(kW). 충전과 방전을 나눈다(손실·수명 판단이 그 둘을 구별한다). */
|
|
1448
1456
|
soc?: number;
|
|
1449
1457
|
chargeKW?: number;
|
|
@@ -2520,6 +2528,30 @@ export interface EnergyEquipmentData {
|
|
|
2520
2528
|
curtailable?: boolean;
|
|
2521
2529
|
minKW?: number;
|
|
2522
2530
|
position?: 'open' | 'closed' | 'intermediate' | 'bad';
|
|
2531
|
+
/**
|
|
2532
|
+
* **전기 계측** — 전압(V)·전류(A). 전기를 만들거나 쓰는 어떤 설비에서나 같은 모양이다
|
|
2533
|
+
* (IEC 61850 의 계측 항목).
|
|
2534
|
+
*
|
|
2535
|
+
* ── 왜 kW 만으로 부족한가 (2026-08-29) ─────────────────────────────────────
|
|
2536
|
+
* 출력이 0 일 때 **왜 0 인지**를 kW 는 말하지 못한다. 전압과 전류가 있으면 값이 답한다.
|
|
2537
|
+
*
|
|
2538
|
+
* 전압 있음 · 전류 0 회로가 끊겼다 (실측: 직류 621.9V · 0A)
|
|
2539
|
+
* 전압 0 · 전류 0 원천이 없다 (밤·차단)
|
|
2540
|
+
* 전압 낮음 · 전류 높음 부하가 무겁거나 계통이 약하다
|
|
2541
|
+
*
|
|
2542
|
+
* ── 직류와 교류를 가른다 ────────────────────────────────────────────────────
|
|
2543
|
+
* 변환기(인버터·정류기)를 낀 설비는 양쪽이 다른 값이고, 어느 쪽이 죽었는지가 곧 어디가 고장인지다.
|
|
2544
|
+
* 한 이름에 담으면 그 구별이 사라진다.
|
|
2545
|
+
*
|
|
2546
|
+
* ── 상별로 받는다 ──────────────────────────────────────────────────────────
|
|
2547
|
+
* 상 불평형은 그 자체로 사실이고, 합치면 되돌릴 수 없다. 단상이면 원소 하나짜리 배열이다.
|
|
2548
|
+
*
|
|
2549
|
+
* **역률은 이 자리에 없다.** 뜻을 확인하지 못한 값을 받으면 화면이 그것을 역률이라고 말한다.
|
|
2550
|
+
*/
|
|
2551
|
+
dcVoltage?: number;
|
|
2552
|
+
dcCurrent?: number;
|
|
2553
|
+
acVoltage?: number[];
|
|
2554
|
+
acCurrent?: number[];
|
|
2523
2555
|
}
|
|
2524
2556
|
/**
|
|
2525
2557
|
* 발전 적산으로 담기는 값 — **발전 설비 하나가 지금까지 만든 양.**
|
package/dist/ems-kernel.js
CHANGED
|
@@ -603,6 +603,11 @@ export class EmsKernel extends FlowEngine {
|
|
|
603
603
|
put('curtailable');
|
|
604
604
|
put('minKW');
|
|
605
605
|
put('position');
|
|
606
|
+
/* 전기 계측 — 「출력이 0인데 왜 0인가」에 값으로 답하는 축(§`EnergyEquipmentData.dcVoltage`). */
|
|
607
|
+
put('dcVoltage');
|
|
608
|
+
put('dcCurrent');
|
|
609
|
+
put('acVoltage');
|
|
610
|
+
put('acCurrent');
|
|
606
611
|
/* **값과 함께 시각을 남긴다** — 없으면 화면이 멈춘 값을 지금 값으로 그린다(계량 지점과 같은 규율). */
|
|
607
612
|
if (d?.at)
|
|
608
613
|
eq.measuredAt = d.at;
|
package/dist/energy-ingest.d.ts
CHANGED
|
@@ -49,6 +49,11 @@ export interface EnergyEquipmentRecord {
|
|
|
49
49
|
curtailable?: boolean;
|
|
50
50
|
minKW?: number;
|
|
51
51
|
position?: string;
|
|
52
|
+
/** 전기 계측 — 전압(V)·전류(A). 상별 값은 배열로(단상이면 원소 하나). */
|
|
53
|
+
dcVoltage?: number;
|
|
54
|
+
dcCurrent?: number;
|
|
55
|
+
acVoltage?: number[];
|
|
56
|
+
acCurrent?: number[];
|
|
52
57
|
}
|
|
53
58
|
/** 이 레코드가 설비 에너지 상태인가 — 라우팅 판정을 한 곳에 둔다. */
|
|
54
59
|
export declare function isEnergyEquipmentRecord(record: unknown): boolean;
|
package/dist/energy-ingest.js
CHANGED
|
@@ -29,7 +29,19 @@ export function isEnergyRecord(record) {
|
|
|
29
29
|
const r = record;
|
|
30
30
|
/* 계량 지점이 있고 EPCIS 어휘가 없으면 에너지다. `epc` 가 함께 있으면 둘 중 무엇인지 알 수 없으므로
|
|
31
31
|
에너지로 받지 않는다 — 그 판단은 커넥터가 명확히 해야 한다. */
|
|
32
|
-
|
|
32
|
+
if (!(typeof r.meterId === 'string' && r.meterId.trim().length > 0 && r.epc === undefined))
|
|
33
|
+
return false;
|
|
34
|
+
/*
|
|
35
|
+
* ── **마감된 구간은 계량 표본이 아니다** (2026-08-29) ──────────────────────
|
|
36
|
+
*
|
|
37
|
+
* 둘 다 `meterId` 를 가지므로 이 판별이 겹쳤다. 겹친 채로 두면 갈림의 **순서**가 값을 정한다 —
|
|
38
|
+
* 순서를 잘못 두면 시간별 사용량이 계량 문으로 가고, 그 문은 `kWh` 를 적산 레지스터로 읽는다.
|
|
39
|
+
* 우리가 넣는 값은 이미 그 구간의 양이므로 **차분의 차분**이 된다.
|
|
40
|
+
*
|
|
41
|
+
* 가장 나쁜 모양이다: **거부되지 않고 값만 틀린다.** 그래서 순서에 기대지 않고 배타로 만든다
|
|
42
|
+
* (설비 상태와 발전 적산을 가를 때와 같은 규율).
|
|
43
|
+
*/
|
|
44
|
+
return r.from === undefined && r.to === undefined;
|
|
33
45
|
}
|
|
34
46
|
/**
|
|
35
47
|
* 표본 레코드들을 봉투로 — 유효한 것만 통과하고 나머지는 이유와 함께 남는다.
|
|
@@ -168,6 +180,49 @@ export function ingestEnergyEquipmentRecords(records, opts) {
|
|
|
168
180
|
else
|
|
169
181
|
curtailable = r.curtailable;
|
|
170
182
|
}
|
|
183
|
+
/*
|
|
184
|
+
* ── 전기 계측 (2026-08-29) ─────────────────────────────────────────────────
|
|
185
|
+
*
|
|
186
|
+
* 음수는 받지 않는다. 전압·전류의 크기는 음수가 되지 않고, 방향은 다른 축이 말한다
|
|
187
|
+
* (`chargeKW`·`dischargeKW`·`exportKW`). 음수를 받아 두면 화면이 「-380V」를 그린다.
|
|
188
|
+
*
|
|
189
|
+
* 상별 값은 **배열 그대로** 받는다. 합치거나 평균 내지 않는다 — 상 불평형은 그 자체로 사실이고,
|
|
190
|
+
* 한 수로 접으면 되돌릴 수 없다.
|
|
191
|
+
*/
|
|
192
|
+
const dcVoltage = num(r?.dcVoltage, 'dcVoltage', 0);
|
|
193
|
+
const dcCurrent = num(r?.dcCurrent, 'dcCurrent', 0);
|
|
194
|
+
const phases = (raw, name) => {
|
|
195
|
+
if (raw === undefined || raw === null)
|
|
196
|
+
return undefined;
|
|
197
|
+
if (!Array.isArray(raw)) {
|
|
198
|
+
errors.push(`${name} 가 배열이 아니다 — 상별 값이라 배열로 받는다(단상이면 원소 하나): ${JSON.stringify(raw)}`);
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
if (!raw.length) {
|
|
202
|
+
errors.push(`${name} 가 빈 배열이다 — 잰 상이 없으면 그 칸을 보내지 않는다`);
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
const out = [];
|
|
206
|
+
for (const [i, v] of raw.entries()) {
|
|
207
|
+
const n = Number(v);
|
|
208
|
+
if (!Number.isFinite(n)) {
|
|
209
|
+
errors.push(`${name}[${i}] 를 수로 읽을 수 없다: ${JSON.stringify(v)}`);
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
if (n < 0) {
|
|
213
|
+
errors.push(`${name}[${i}] 가 음수다(${n}) — 크기는 음수가 되지 않는다(방향은 다른 축이 말한다)`);
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
out.push(n);
|
|
217
|
+
}
|
|
218
|
+
return out;
|
|
219
|
+
};
|
|
220
|
+
const acVoltage = phases(r?.acVoltage, 'acVoltage');
|
|
221
|
+
const acCurrent = phases(r?.acCurrent, 'acCurrent');
|
|
222
|
+
/* 상 수가 다르면 짝이 맞지 않는다 — 어느 상의 전류인지 알 수 없는 값을 받지 않는다. */
|
|
223
|
+
if (acVoltage && acCurrent && acVoltage.length !== acCurrent.length) {
|
|
224
|
+
errors.push(`acVoltage(${acVoltage.length}상)와 acCurrent(${acCurrent.length}상)의 상 수가 다르다`);
|
|
225
|
+
}
|
|
171
226
|
let position;
|
|
172
227
|
if (r?.position !== undefined && r?.position !== null && r?.position !== '') {
|
|
173
228
|
const p = String(r.position);
|
|
@@ -176,7 +231,7 @@ export function ingestEnergyEquipmentRecords(records, opts) {
|
|
|
176
231
|
else
|
|
177
232
|
position = p;
|
|
178
233
|
}
|
|
179
|
-
const values = { generatedKW, exportKW, soc, chargeKW, dischargeKW, curtailable, minKW, position };
|
|
234
|
+
const values = { generatedKW, exportKW, soc, chargeKW, dischargeKW, curtailable, minKW, position, dcVoltage, dcCurrent, acVoltage, acCurrent };
|
|
180
235
|
if (!errors.length && Object.values(values).every(v => v === undefined)) {
|
|
181
236
|
errors.push('바꿀 상태가 하나도 없다 — 값 없는 보고는 사실로 적을 것이 없다');
|
|
182
237
|
}
|
|
@@ -195,7 +250,11 @@ export function ingestEnergyEquipmentRecords(records, opts) {
|
|
|
195
250
|
...(dischargeKW !== undefined ? { dischargeKW } : {}),
|
|
196
251
|
...(curtailable !== undefined ? { curtailable } : {}),
|
|
197
252
|
...(minKW !== undefined ? { minKW } : {}),
|
|
198
|
-
...(position !== undefined ? { position } : {})
|
|
253
|
+
...(position !== undefined ? { position } : {}),
|
|
254
|
+
...(dcVoltage !== undefined ? { dcVoltage } : {}),
|
|
255
|
+
...(dcCurrent !== undefined ? { dcCurrent } : {}),
|
|
256
|
+
...(acVoltage !== undefined ? { acVoltage } : {}),
|
|
257
|
+
...(acCurrent !== undefined ? { acCurrent } : {})
|
|
199
258
|
};
|
|
200
259
|
accepted.push({
|
|
201
260
|
eventId: `${opts.tenantId}-energy-eq-${++seq}`,
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -2757,7 +2757,7 @@ var CAPABILITIES = {
|
|
|
2757
2757
|
* 계량 능력(`metered`)이 `kW` 와 `kWh` 를 함께 선언한 것과 같은 짝이다. 적산은 발전 설비의 보편적
|
|
2758
2758
|
* 사실이고(태양광·열병합·디젤), 그것이 없으면 성능비·발전시간 같은 성과를 아무도 셀 수 없다.
|
|
2759
2759
|
*/
|
|
2760
|
-
stateFields: ["generatedKW", "exportKW", "generatedKWh", "generatedKWhResetAt", "generatedKWhSince", "generatedKWhBasis", "generatedKWhAccumulation", "generatedKWhLastPeriod", "generatedKWhLastPeriodEnd", "generatedKWhLastPeriodObservedFrom", "generatedKWhLastPeriodObservedTo"],
|
|
2760
|
+
stateFields: ["generatedKW", "exportKW", "generatedKWh", "generatedKWhResetAt", "generatedKWhSince", "generatedKWhBasis", "generatedKWhAccumulation", "generatedKWhLastPeriod", "generatedKWhLastPeriodEnd", "generatedKWhLastPeriodObservedFrom", "generatedKWhLastPeriodObservedTo", "dcVoltage", "dcCurrent", "acVoltage", "acCurrent"],
|
|
2761
2761
|
models: ["GeneratingState"],
|
|
2762
2762
|
results: ["generated"]
|
|
2763
2763
|
},
|
|
@@ -8178,6 +8178,10 @@ var EmsKernel = class extends FlowEngine {
|
|
|
8178
8178
|
put("curtailable");
|
|
8179
8179
|
put("minKW");
|
|
8180
8180
|
put("position");
|
|
8181
|
+
put("dcVoltage");
|
|
8182
|
+
put("dcCurrent");
|
|
8183
|
+
put("acVoltage");
|
|
8184
|
+
put("acCurrent");
|
|
8181
8185
|
if (d?.at) eq.measuredAt = d.at;
|
|
8182
8186
|
const heardAt = Date.parse(String(d?.at ?? envelope.eventTime ?? ""));
|
|
8183
8187
|
if (Number.isFinite(heardAt)) this.noteObserved(heardAt);
|
|
@@ -9531,7 +9535,8 @@ var TwinRuntime = class {
|
|
|
9531
9535
|
function isEnergyRecord(record) {
|
|
9532
9536
|
if (!record || typeof record !== "object") return false;
|
|
9533
9537
|
const r = record;
|
|
9534
|
-
|
|
9538
|
+
if (!(typeof r.meterId === "string" && r.meterId.trim().length > 0 && r.epc === void 0)) return false;
|
|
9539
|
+
return r.from === void 0 && r.to === void 0;
|
|
9535
9540
|
}
|
|
9536
9541
|
function ingestEnergyRecords(records, opts) {
|
|
9537
9542
|
const arr = Array.isArray(records) ? records : records ? [records] : [];
|
|
@@ -9629,13 +9634,45 @@ function ingestEnergyEquipmentRecords(records, opts) {
|
|
|
9629
9634
|
if (typeof r.curtailable !== "boolean") errors.push(`curtailable \uAC00 \uCC38/\uAC70\uC9D3\uC774 \uC544\uB2C8\uB2E4: ${JSON.stringify(r.curtailable)}`);
|
|
9630
9635
|
else curtailable = r.curtailable;
|
|
9631
9636
|
}
|
|
9637
|
+
const dcVoltage = num(r?.dcVoltage, "dcVoltage", 0);
|
|
9638
|
+
const dcCurrent = num(r?.dcCurrent, "dcCurrent", 0);
|
|
9639
|
+
const phases = (raw, name) => {
|
|
9640
|
+
if (raw === void 0 || raw === null) return void 0;
|
|
9641
|
+
if (!Array.isArray(raw)) {
|
|
9642
|
+
errors.push(`${name} \uAC00 \uBC30\uC5F4\uC774 \uC544\uB2C8\uB2E4 \u2014 \uC0C1\uBCC4 \uAC12\uC774\uB77C \uBC30\uC5F4\uB85C \uBC1B\uB294\uB2E4(\uB2E8\uC0C1\uC774\uBA74 \uC6D0\uC18C \uD558\uB098): ${JSON.stringify(raw)}`);
|
|
9643
|
+
return void 0;
|
|
9644
|
+
}
|
|
9645
|
+
if (!raw.length) {
|
|
9646
|
+
errors.push(`${name} \uAC00 \uBE48 \uBC30\uC5F4\uC774\uB2E4 \u2014 \uC7B0 \uC0C1\uC774 \uC5C6\uC73C\uBA74 \uADF8 \uCE78\uC744 \uBCF4\uB0B4\uC9C0 \uC54A\uB294\uB2E4`);
|
|
9647
|
+
return void 0;
|
|
9648
|
+
}
|
|
9649
|
+
const out = [];
|
|
9650
|
+
for (const [i, v] of raw.entries()) {
|
|
9651
|
+
const n = Number(v);
|
|
9652
|
+
if (!Number.isFinite(n)) {
|
|
9653
|
+
errors.push(`${name}[${i}] \uB97C \uC218\uB85C \uC77D\uC744 \uC218 \uC5C6\uB2E4: ${JSON.stringify(v)}`);
|
|
9654
|
+
return void 0;
|
|
9655
|
+
}
|
|
9656
|
+
if (n < 0) {
|
|
9657
|
+
errors.push(`${name}[${i}] \uAC00 \uC74C\uC218\uB2E4(${n}) \u2014 \uD06C\uAE30\uB294 \uC74C\uC218\uAC00 \uB418\uC9C0 \uC54A\uB294\uB2E4(\uBC29\uD5A5\uC740 \uB2E4\uB978 \uCD95\uC774 \uB9D0\uD55C\uB2E4)`);
|
|
9658
|
+
return void 0;
|
|
9659
|
+
}
|
|
9660
|
+
out.push(n);
|
|
9661
|
+
}
|
|
9662
|
+
return out;
|
|
9663
|
+
};
|
|
9664
|
+
const acVoltage = phases(r?.acVoltage, "acVoltage");
|
|
9665
|
+
const acCurrent = phases(r?.acCurrent, "acCurrent");
|
|
9666
|
+
if (acVoltage && acCurrent && acVoltage.length !== acCurrent.length) {
|
|
9667
|
+
errors.push(`acVoltage(${acVoltage.length}\uC0C1)\uC640 acCurrent(${acCurrent.length}\uC0C1)\uC758 \uC0C1 \uC218\uAC00 \uB2E4\uB974\uB2E4`);
|
|
9668
|
+
}
|
|
9632
9669
|
let position;
|
|
9633
9670
|
if (r?.position !== void 0 && r?.position !== null && r?.position !== "") {
|
|
9634
9671
|
const p = String(r.position);
|
|
9635
9672
|
if (!POSITIONS.has(p)) errors.push(`position \uC774 \uD45C\uC900 \uAC12\uC774 \uC544\uB2C8\uB2E4(open\xB7closed\xB7intermediate\xB7bad): ${JSON.stringify(r.position)}`);
|
|
9636
9673
|
else position = p;
|
|
9637
9674
|
}
|
|
9638
|
-
const values = { generatedKW, exportKW, soc, chargeKW, dischargeKW, curtailable, minKW, position };
|
|
9675
|
+
const values = { generatedKW, exportKW, soc, chargeKW, dischargeKW, curtailable, minKW, position, dcVoltage, dcCurrent, acVoltage, acCurrent };
|
|
9639
9676
|
if (!errors.length && Object.values(values).every((v) => v === void 0)) {
|
|
9640
9677
|
errors.push("\uBC14\uAFC0 \uC0C1\uD0DC\uAC00 \uD558\uB098\uB3C4 \uC5C6\uB2E4 \u2014 \uAC12 \uC5C6\uB294 \uBCF4\uACE0\uB294 \uC0AC\uC2E4\uB85C \uC801\uC744 \uAC83\uC774 \uC5C6\uB2E4");
|
|
9641
9678
|
}
|
|
@@ -9654,7 +9691,11 @@ function ingestEnergyEquipmentRecords(records, opts) {
|
|
|
9654
9691
|
...dischargeKW !== void 0 ? { dischargeKW } : {},
|
|
9655
9692
|
...curtailable !== void 0 ? { curtailable } : {},
|
|
9656
9693
|
...minKW !== void 0 ? { minKW } : {},
|
|
9657
|
-
...position !== void 0 ? { position } : {}
|
|
9694
|
+
...position !== void 0 ? { position } : {},
|
|
9695
|
+
...dcVoltage !== void 0 ? { dcVoltage } : {},
|
|
9696
|
+
...dcCurrent !== void 0 ? { dcCurrent } : {},
|
|
9697
|
+
...acVoltage !== void 0 ? { acVoltage } : {},
|
|
9698
|
+
...acCurrent !== void 0 ? { acCurrent } : {}
|
|
9658
9699
|
};
|
|
9659
9700
|
accepted.push({
|
|
9660
9701
|
eventId: `${opts.tenantId}-energy-eq-${++seq}`,
|
package/package.json
CHANGED