@operato/twin-kernel 0.7.17 → 0.7.18
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/ems-profile.d.ts +26 -1
- package/dist/ems-profile.js +15 -1
- package/dist-cjs/index.cjs +17 -1
- package/package.json +1 -1
package/dist/ems-profile.d.ts
CHANGED
|
@@ -37,8 +37,33 @@ export declare const EMS_PROPERTY: {
|
|
|
37
37
|
* 「SOC 를 모르면 방전하지 않는다」는 규율에 걸려 **배터리가 아무 일도 하지 못했다** — 정책을 선언해도
|
|
38
38
|
* 피크가 한 톨도 깎이지 않았다(실화면에서 그렇게 났다).
|
|
39
39
|
*
|
|
40
|
-
* 이것은 상태의 씨앗이지 계측이 아니다. 그래서 계측이 들어오는 순간 그것이
|
|
40
|
+
* 이것은 상태의 씨앗이지 계측이 아니다. 그래서 계측이 들어오는 순간 그것이 이긴다.
|
|
41
41
|
*/
|
|
42
42
|
readonly initialSoc: "storage.initialSoc";
|
|
43
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* 이 선언들의 **단위와 범위** — 값을 읽는 쪽이 아니라 **주는 쪽**을 위한 표다.
|
|
46
|
+
*
|
|
47
|
+
* ── 왜 커널이 단위를 말해야 하나 (2026-08-17) ────────────────────────────────
|
|
48
|
+
* 사용자가 「현재 SOC 80%」라고 말했고, 저작 AI 는 `storage.initialSoc = 0.8` 을 썼다. 커널은 이 값을
|
|
49
|
+
* **퍼센트**로 읽으므로(`(soc - reserve) / 100`) 그 배터리는 0.8% 로 선언됐다 — 쓸 수 있는 에너지가
|
|
50
|
+
* 사실상 없는 상태이고, **경고 하나 없이** 그렇게 됐다. 실화면에서 그렇게 났다.
|
|
51
|
+
*
|
|
52
|
+
* 잘못은 값을 준 쪽이 아니라 **단위를 말하지 않은 쪽**에 있다. 타입을 지어내지 못하게 카탈로그를 주면서
|
|
53
|
+
* 속성은 id 만 줬으니, 값을 만드는 쪽은 단위를 짐작할 수밖에 없었다.
|
|
54
|
+
*
|
|
55
|
+
* 표를 커널에 두는 이유: 이 단위는 **커널의 셈법이 정하는 것**이다(퍼센트로 나누는 코드가 여기 있다).
|
|
56
|
+
* 소비처마다 적으면 두 벌이 되고, 두 벌은 갈라진다 — 갈라지는 순간 이 결함이 그대로 돌아온다.
|
|
57
|
+
*/
|
|
58
|
+
export interface EmsPropertySpec {
|
|
59
|
+
/** 단위 — 사람이 읽는 표기(kW·kWh·% 등). 무차원이면 없다. */
|
|
60
|
+
uom?: string;
|
|
61
|
+
/** 값의 종류 — GS1 dataType 표기(`xs:double`·`xs:string`). */
|
|
62
|
+
dataType: 'xs:double' | 'xs:string';
|
|
63
|
+
/** 허용 범위 [min, max] — 밖의 값은 받는 쪽이 거절할 수 있다(있는 것만 적는다). */
|
|
64
|
+
range?: [number, number];
|
|
65
|
+
/** 무엇을 뜻하나 — 영어 canonical(표현 계층이 사용자 언어로 옮긴다). */
|
|
66
|
+
note: string;
|
|
67
|
+
}
|
|
68
|
+
export declare const EMS_PROPERTY_SPEC: Record<string, EmsPropertySpec>;
|
|
44
69
|
export declare const EMS_TYPES: TwinTypeInfo[];
|
package/dist/ems-profile.js
CHANGED
|
@@ -69,10 +69,24 @@ export const EMS_PROPERTY = {
|
|
|
69
69
|
* 「SOC 를 모르면 방전하지 않는다」는 규율에 걸려 **배터리가 아무 일도 하지 못했다** — 정책을 선언해도
|
|
70
70
|
* 피크가 한 톨도 깎이지 않았다(실화면에서 그렇게 났다).
|
|
71
71
|
*
|
|
72
|
-
* 이것은 상태의 씨앗이지 계측이 아니다. 그래서 계측이 들어오는 순간 그것이
|
|
72
|
+
* 이것은 상태의 씨앗이지 계측이 아니다. 그래서 계측이 들어오는 순간 그것이 이긴다.
|
|
73
73
|
*/
|
|
74
74
|
initialSoc: 'storage.initialSoc'
|
|
75
75
|
};
|
|
76
|
+
export const EMS_PROPERTY_SPEC = {
|
|
77
|
+
[EMS_PROPERTY.contractKW]: { uom: 'kW', dataType: 'xs:double', note: 'contracted power at the metering point, in kW.' },
|
|
78
|
+
[EMS_PROPERTY.ratedKW]: { uom: 'kW', dataType: 'xs:double', note: 'power drawn while running, in kW.' },
|
|
79
|
+
[EMS_PROPERTY.standbyKW]: { uom: 'kW', dataType: 'xs:double', note: 'power drawn while idle, in kW.' },
|
|
80
|
+
[EMS_PROPERTY.demandChargePerKW]: { dataType: 'xs:double', note: 'demand charge per kW of billing-period peak, in the declared currency.' },
|
|
81
|
+
[EMS_PROPERTY.energyChargePerKWh]: { dataType: 'xs:double', note: 'energy charge per kWh, in the declared currency.' },
|
|
82
|
+
[EMS_PROPERTY.currency]: { dataType: 'xs:string', note: 'ISO 4217 currency code, e.g. USD or KRW.' },
|
|
83
|
+
[EMS_PROPERTY.capacityKWh]: { uom: 'kWh', dataType: 'xs:double', note: 'usable energy of the storage, in kWh.' },
|
|
84
|
+
[EMS_PROPERTY.dischargeAboveKW]: { uom: 'kW', dataType: 'xs:double', note: 'net demand above which the storage discharges, in kW.' },
|
|
85
|
+
[EMS_PROPERTY.maxDischargeKW]: { uom: 'kW', dataType: 'xs:double', note: 'inverter limit on discharge rate, in kW.' },
|
|
86
|
+
/* 퍼센트다 — 0.8 은 0.8% 이고 80% 가 아니다. 이 한 줄이 없어서 배터리가 조용히 비어 있었다. */
|
|
87
|
+
[EMS_PROPERTY.reserveSoc]: { uom: '%', dataType: 'xs:double', range: [0, 100], note: 'reserve state of charge as a percentage 0-100 (20 means 20%), never discharged below.' },
|
|
88
|
+
[EMS_PROPERTY.initialSoc]: { uom: '%', dataType: 'xs:double', range: [0, 100], note: 'starting state of charge as a percentage 0-100 (80 means 80%, not 0.8).' }
|
|
89
|
+
};
|
|
76
90
|
export const EMS_TYPES = [
|
|
77
91
|
/* ── 자리: 전기적 구간 ─────────────────────────────────────────────────── */
|
|
78
92
|
{
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -34,6 +34,7 @@ __export(index_exports, {
|
|
|
34
34
|
EMS_EQUIPMENT_TYPES: () => EMS_EQUIPMENT_TYPES,
|
|
35
35
|
EMS_LOCATION_TYPES: () => EMS_LOCATION_TYPES,
|
|
36
36
|
EMS_PROPERTY: () => EMS_PROPERTY,
|
|
37
|
+
EMS_PROPERTY_SPEC: () => EMS_PROPERTY_SPEC,
|
|
37
38
|
EMS_TYPES: () => EMS_TYPES,
|
|
38
39
|
ENERGY_EVENT: () => ENERGY_EVENT,
|
|
39
40
|
EPCIS_CONTEXT: () => EPCIS_CONTEXT,
|
|
@@ -1733,10 +1734,24 @@ var EMS_PROPERTY = {
|
|
|
1733
1734
|
* 「SOC 를 모르면 방전하지 않는다」는 규율에 걸려 **배터리가 아무 일도 하지 못했다** — 정책을 선언해도
|
|
1734
1735
|
* 피크가 한 톨도 깎이지 않았다(실화면에서 그렇게 났다).
|
|
1735
1736
|
*
|
|
1736
|
-
* 이것은 상태의 씨앗이지 계측이 아니다. 그래서 계측이 들어오는 순간 그것이
|
|
1737
|
+
* 이것은 상태의 씨앗이지 계측이 아니다. 그래서 계측이 들어오는 순간 그것이 이긴다.
|
|
1737
1738
|
*/
|
|
1738
1739
|
initialSoc: "storage.initialSoc"
|
|
1739
1740
|
};
|
|
1741
|
+
var EMS_PROPERTY_SPEC = {
|
|
1742
|
+
[EMS_PROPERTY.contractKW]: { uom: "kW", dataType: "xs:double", note: "contracted power at the metering point, in kW." },
|
|
1743
|
+
[EMS_PROPERTY.ratedKW]: { uom: "kW", dataType: "xs:double", note: "power drawn while running, in kW." },
|
|
1744
|
+
[EMS_PROPERTY.standbyKW]: { uom: "kW", dataType: "xs:double", note: "power drawn while idle, in kW." },
|
|
1745
|
+
[EMS_PROPERTY.demandChargePerKW]: { dataType: "xs:double", note: "demand charge per kW of billing-period peak, in the declared currency." },
|
|
1746
|
+
[EMS_PROPERTY.energyChargePerKWh]: { dataType: "xs:double", note: "energy charge per kWh, in the declared currency." },
|
|
1747
|
+
[EMS_PROPERTY.currency]: { dataType: "xs:string", note: "ISO 4217 currency code, e.g. USD or KRW." },
|
|
1748
|
+
[EMS_PROPERTY.capacityKWh]: { uom: "kWh", dataType: "xs:double", note: "usable energy of the storage, in kWh." },
|
|
1749
|
+
[EMS_PROPERTY.dischargeAboveKW]: { uom: "kW", dataType: "xs:double", note: "net demand above which the storage discharges, in kW." },
|
|
1750
|
+
[EMS_PROPERTY.maxDischargeKW]: { uom: "kW", dataType: "xs:double", note: "inverter limit on discharge rate, in kW." },
|
|
1751
|
+
/* 퍼센트다 — 0.8 은 0.8% 이고 80% 가 아니다. 이 한 줄이 없어서 배터리가 조용히 비어 있었다. */
|
|
1752
|
+
[EMS_PROPERTY.reserveSoc]: { uom: "%", dataType: "xs:double", range: [0, 100], note: "reserve state of charge as a percentage 0-100 (20 means 20%), never discharged below." },
|
|
1753
|
+
[EMS_PROPERTY.initialSoc]: { uom: "%", dataType: "xs:double", range: [0, 100], note: "starting state of charge as a percentage 0-100 (80 means 80%, not 0.8)." }
|
|
1754
|
+
};
|
|
1740
1755
|
var EMS_TYPES = [
|
|
1741
1756
|
/* ── 자리: 전기적 구간 ─────────────────────────────────────────────────── */
|
|
1742
1757
|
{
|
|
@@ -6782,6 +6797,7 @@ function retiredVocabularyIn(line) {
|
|
|
6782
6797
|
EMS_EQUIPMENT_TYPES,
|
|
6783
6798
|
EMS_LOCATION_TYPES,
|
|
6784
6799
|
EMS_PROPERTY,
|
|
6800
|
+
EMS_PROPERTY_SPEC,
|
|
6785
6801
|
EMS_TYPES,
|
|
6786
6802
|
ENERGY_EVENT,
|
|
6787
6803
|
EPCIS_CONTEXT,
|
package/package.json
CHANGED