@utiliread/primitives 1.0.0-7 → 1.0.0-71
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/cjs/aggregate-id.js +2 -2
- package/dist/cjs/consumption-type-id.js +2 -2
- package/dist/cjs/index.js +21 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/measure-id.js +3 -0
- package/dist/cjs/measure-id.js.map +1 -0
- package/dist/cjs/number-formatter.js +81 -50
- package/dist/cjs/number-formatter.js.map +1 -1
- package/dist/cjs/number-formatter.spec.js +98 -0
- package/dist/cjs/number-formatter.spec.js.map +1 -0
- package/dist/cjs/optional.js +3 -0
- package/dist/cjs/optional.js.map +1 -0
- package/dist/cjs/precision-number.js +36 -0
- package/dist/cjs/precision-number.js.map +1 -0
- package/dist/cjs/precision-number.spec.js +27 -0
- package/dist/cjs/precision-number.spec.js.map +1 -0
- package/dist/cjs/register-convention.js +56 -0
- package/dist/cjs/register-convention.js.map +1 -0
- package/dist/cjs/register-convention.spec.js +39 -0
- package/dist/cjs/register-convention.spec.js.map +1 -0
- package/dist/cjs/register-definition.js +2 -2
- package/dist/cjs/register-id.js +2 -2
- package/dist/cjs/register-library.js +50 -41
- package/dist/cjs/register-library.js.map +1 -1
- package/dist/cjs/register-library.spec.js +36 -29
- package/dist/cjs/register-library.spec.js.map +1 -1
- package/dist/cjs/register-pack.js +2 -2
- package/dist/cjs/register-utils.js +8 -0
- package/dist/cjs/register-utils.js.map +1 -0
- package/dist/cjs/repository.js +26 -0
- package/dist/cjs/repository.js.map +1 -0
- package/dist/cjs/repository.spec.js +21 -0
- package/dist/cjs/repository.spec.js.map +1 -0
- package/dist/cjs/step.js +41 -0
- package/dist/cjs/step.js.map +1 -0
- package/dist/cjs/step.spec.js +29 -0
- package/dist/cjs/step.spec.js.map +1 -0
- package/dist/cjs/time-or-rule.js +19 -0
- package/dist/cjs/time-or-rule.js.map +1 -0
- package/dist/cjs/unit-id.js +13 -13
- package/dist/cjs/unit-id.js.map +1 -1
- package/dist/esm/aggregate-id.d.ts +1 -1
- package/dist/esm/aggregate-id.js +1 -1
- package/dist/esm/consumption-type-id.d.ts +1 -1
- package/dist/esm/consumption-type-id.js +1 -1
- package/dist/esm/index.d.ts +16 -8
- package/dist/esm/index.js +9 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/measure-id.d.ts +1 -0
- package/dist/esm/measure-id.js +2 -0
- package/dist/esm/measure-id.js.map +1 -0
- package/dist/esm/number-formatter.d.ts +17 -8
- package/dist/esm/number-formatter.js +78 -47
- package/dist/esm/number-formatter.js.map +1 -1
- package/dist/esm/{register-converter.spec.d.ts → number-formatter.spec.d.ts} +1 -1
- package/dist/esm/number-formatter.spec.js +96 -0
- package/dist/esm/number-formatter.spec.js.map +1 -0
- package/dist/esm/optional.d.ts +1 -0
- package/dist/esm/optional.js +2 -0
- package/dist/esm/optional.js.map +1 -0
- package/dist/esm/precision-number.d.ts +11 -0
- package/dist/esm/precision-number.js +32 -0
- package/dist/esm/precision-number.js.map +1 -0
- package/dist/esm/precision-number.spec.d.ts +1 -0
- package/dist/esm/precision-number.spec.js +25 -0
- package/dist/esm/precision-number.spec.js.map +1 -0
- package/dist/esm/register-convention.d.ts +14 -0
- package/dist/esm/register-convention.js +52 -0
- package/dist/esm/register-convention.js.map +1 -0
- package/dist/esm/register-convention.spec.d.ts +1 -0
- package/dist/esm/register-convention.spec.js +37 -0
- package/dist/esm/register-convention.spec.js.map +1 -0
- package/dist/esm/register-definition.d.ts +13 -9
- package/dist/esm/register-definition.js +1 -1
- package/dist/esm/register-id.d.ts +1 -1
- package/dist/esm/register-id.js +1 -1
- package/dist/esm/register-library.d.ts +15 -11
- package/dist/esm/register-library.js +47 -38
- package/dist/esm/register-library.js.map +1 -1
- package/dist/esm/register-library.spec.d.ts +1 -1
- package/dist/esm/register-library.spec.js +34 -27
- package/dist/esm/register-library.spec.js.map +1 -1
- package/dist/esm/register-pack.d.ts +4 -4
- package/dist/esm/register-pack.js +1 -1
- package/dist/esm/register-utils.d.ts +3 -0
- package/dist/esm/register-utils.js +4 -0
- package/dist/esm/register-utils.js.map +1 -0
- package/dist/esm/repository.d.ts +9 -0
- package/dist/esm/repository.js +22 -0
- package/dist/esm/repository.js.map +1 -0
- package/dist/esm/repository.spec.d.ts +1 -0
- package/dist/esm/repository.spec.js +19 -0
- package/dist/esm/repository.spec.js.map +1 -0
- package/dist/esm/step.d.ts +15 -0
- package/dist/esm/step.js +38 -0
- package/dist/esm/step.js.map +1 -0
- package/dist/esm/step.spec.d.ts +1 -0
- package/dist/esm/step.spec.js +27 -0
- package/dist/esm/step.spec.js.map +1 -0
- package/dist/esm/time-or-rule.d.ts +7 -0
- package/dist/esm/time-or-rule.js +16 -0
- package/dist/esm/time-or-rule.js.map +1 -0
- package/dist/esm/unit-id.d.ts +2 -2
- package/dist/esm/unit-id.js +10 -10
- package/dist/esm/unit-id.js.map +1 -1
- package/karma.config.js +14 -14
- package/locales/da/aggregates.json +8 -0
- package/locales/da/consumption-types.json +7 -0
- package/locales/da/measures.json +16 -0
- package/locales/da/registers.json +221 -0
- package/locales/da/units.json +93 -0
- package/locales/en/aggregates.json +8 -0
- package/locales/en/consumption-types.json +7 -0
- package/locales/en/measures.json +16 -0
- package/locales/en/registers.json +221 -0
- package/locales/en/units.json +93 -0
- package/package.json +13 -6
- package/src/aggregate-id.ts +9 -9
- package/src/consumption-type-id.ts +8 -8
- package/src/index.ts +29 -11
- package/src/measure-id.ts +15 -0
- package/src/number-formatter.spec.ts +105 -77
- package/src/number-formatter.ts +95 -50
- package/src/optional.ts +1 -0
- package/src/precision-number.spec.ts +28 -0
- package/src/precision-number.ts +36 -0
- package/src/register-convention.spec.ts +43 -0
- package/src/register-convention.ts +61 -0
- package/src/register-definition.ts +14 -1
- package/src/register-id.ts +119 -7
- package/src/register-library.spec.ts +41 -33
- package/src/register-library.ts +57 -37
- package/src/register-pack.ts +5 -5
- package/src/register-utils.ts +6 -0
- package/src/repository.spec.ts +20 -0
- package/src/repository.ts +24 -0
- package/src/step.spec.ts +30 -0
- package/src/step.ts +37 -0
- package/src/time-or-rule.ts +17 -0
- package/src/unit-id.ts +131 -100
- package/tsconfig.cjs.json +7 -8
- package/tsconfig.json +15 -14
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/base.css +0 -224
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/block-navigation.js +0 -79
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/favicon.png +0 -0
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/index.html +0 -96
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/prettify.css +0 -1
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/prettify.js +0 -2
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/sort-arrow-sprite.png +0 -0
- package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/sorter.js +0 -170
- package/dist/cjs/register-converter.js +0 -47
- package/dist/cjs/register-converter.js.map +0 -1
- package/dist/cjs/register-converter.spec.js +0 -29
- package/dist/cjs/register-converter.spec.js.map +0 -1
- package/dist/esm/register-converter.d.ts +0 -9
- package/dist/esm/register-converter.js +0 -44
- package/dist/esm/register-converter.js.map +0 -1
- package/dist/esm/register-converter.spec.js +0 -27
- package/dist/esm/register-converter.spec.js.map +0 -1
- package/src/register-converter.spec.ts +0 -31
- package/src/register-converter.ts +0 -48
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { expect } from "chai";
|
|
2
|
+
import { RegisterConvention } from "./register-convention";
|
|
3
|
+
|
|
4
|
+
describe("getAggregate", () => {
|
|
5
|
+
it("instant register is instant", () => {
|
|
6
|
+
const result = RegisterConvention.getAggregate("flowTemperature");
|
|
7
|
+
expect(result).to.equal("instant");
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it("avg register is avg", () => {
|
|
11
|
+
const result = RegisterConvention.getAggregate("avgFlowTemperature");
|
|
12
|
+
expect(result).to.equal("avg");
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
describe("toInstant", () => {
|
|
17
|
+
it("should convert instant", () => {
|
|
18
|
+
const registerId = RegisterConvention.toInstant("flowTemperature");
|
|
19
|
+
expect(registerId).to.equal("flowTemperature");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("should convert aggregate", () => {
|
|
23
|
+
const registerId = RegisterConvention.toInstant("avgFlowTemperature");
|
|
24
|
+
expect(registerId).to.equal("flowTemperature");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe("toAggregate", () => {
|
|
29
|
+
it("should convert instant to aggregate", () => {
|
|
30
|
+
const registerId = RegisterConvention.toAggregate("flowTemperature", "avg");
|
|
31
|
+
expect(registerId).to.equal("avgFlowTemperature");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should convert aggregate to same aggregate", () => {
|
|
35
|
+
const registerId = RegisterConvention.toAggregate("avgFlowTemperature", "avg");
|
|
36
|
+
expect(registerId).to.equal("avgFlowTemperature");
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should convert aggregate to other aggregate", () => {
|
|
40
|
+
const registerId = RegisterConvention.toAggregate("avgFlowTemperature", "min");
|
|
41
|
+
expect(registerId).to.equal("minFlowTemperature");
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RegisterDefinition } from ".";
|
|
2
|
+
import { AggregateId } from "./aggregate-id";
|
|
3
|
+
import { RegisterId } from "./register-id";
|
|
4
|
+
import { getRegisterId } from "./register-utils";
|
|
5
|
+
|
|
6
|
+
export const aggregatePrefixes: { [aggregateId in AggregateId]: string } = {
|
|
7
|
+
instant: "",
|
|
8
|
+
diff: "diff",
|
|
9
|
+
min: "min",
|
|
10
|
+
max: "max",
|
|
11
|
+
avg: "avg",
|
|
12
|
+
sum: "sum",
|
|
13
|
+
cnt: "cnt",
|
|
14
|
+
ssq: "ssq",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
class Convention {
|
|
18
|
+
public getAggregate(register: RegisterId | RegisterDefinition) {
|
|
19
|
+
const registerId = getRegisterId(register);
|
|
20
|
+
// Brute force all prefixes - if none of them, then it must be instant.
|
|
21
|
+
for (const aggregateString of Object.keys(aggregatePrefixes)) {
|
|
22
|
+
const aggregate = <AggregateId>aggregateString;
|
|
23
|
+
const prefix = aggregatePrefixes[aggregate];
|
|
24
|
+
if (prefix.length && isPrefix(registerId, prefix)) {
|
|
25
|
+
// Not instant - it was any of the others.
|
|
26
|
+
return aggregate;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return "instant";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
toInstant(register: RegisterId | RegisterDefinition) {
|
|
33
|
+
const registerId = getRegisterId(register);
|
|
34
|
+
for (const prefix of Object.values(aggregatePrefixes)) {
|
|
35
|
+
if (prefix.length && isPrefix(registerId, prefix)) {
|
|
36
|
+
const tail = registerId.substr(prefix.length);
|
|
37
|
+
return <RegisterId>(tail[0].toLowerCase() + tail.substr(1));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return registerId;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
toAggregate(register: RegisterId | RegisterDefinition, aggregate: AggregateId) {
|
|
44
|
+
const instantRegisterId = this.toInstant(register);
|
|
45
|
+
if (aggregate === "instant") {
|
|
46
|
+
return instantRegisterId;
|
|
47
|
+
}
|
|
48
|
+
const prefix = aggregatePrefixes[aggregate];
|
|
49
|
+
return <RegisterId>(prefix + instantRegisterId[0].toUpperCase() + instantRegisterId.substr(1));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function isPrefix(registerId: RegisterId, prefix: string) {
|
|
54
|
+
return registerId.startsWith(prefix) && isUppercase(registerId[prefix.length]);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function isUppercase(input: string) {
|
|
58
|
+
return input.toUpperCase() === input;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export const RegisterConvention = new Convention();
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import { UnitId } from ".";
|
|
2
2
|
import { AggregateId } from "./aggregate-id";
|
|
3
|
+
import { MeasureId } from "./measure-id";
|
|
3
4
|
import { RegisterId } from "./register-id";
|
|
4
5
|
|
|
5
6
|
export interface RegisterDefinition {
|
|
7
|
+
/// The id of the register
|
|
6
8
|
id: RegisterId;
|
|
9
|
+
/// The register measure
|
|
10
|
+
measure: MeasureId;
|
|
11
|
+
/// The aggregate of the register
|
|
7
12
|
aggregate: AggregateId;
|
|
13
|
+
/// The possible register units
|
|
8
14
|
units: ReadonlyArray<UnitId>;
|
|
15
|
+
/// Whether the register can only be resolved by "present value".
|
|
9
16
|
immediate?: true;
|
|
10
|
-
|
|
17
|
+
/// An optional concise register name.
|
|
18
|
+
/// Only used for custom registers as locales exist for standard registers.
|
|
19
|
+
name?: string;
|
|
20
|
+
/// An optional register description.
|
|
21
|
+
/// Only used for custom registers as locales exist for standard registers.
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
package/src/register-id.ts
CHANGED
|
@@ -1,146 +1,250 @@
|
|
|
1
1
|
export type RegisterId =
|
|
2
2
|
"none" |
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
"heatEnergy" |
|
|
5
5
|
"diffHeatEnergy" |
|
|
6
|
+
"cntHeatEnergy" |
|
|
6
7
|
|
|
7
8
|
"heatEnergyVolumeInInlet" |
|
|
8
9
|
"diffHeatEnergyVolumeInInlet" |
|
|
10
|
+
"cntHeatEnergyVolumeInInlet" |
|
|
9
11
|
|
|
10
12
|
"heatEnergyVolumeInOutlet" |
|
|
11
13
|
"diffHeatEnergyVolumeInOutlet" |
|
|
14
|
+
"cntHeatEnergyVolumeInOutlet" |
|
|
12
15
|
|
|
13
16
|
"coolingEnergy" |
|
|
14
17
|
"diffCoolingEnergy" |
|
|
18
|
+
"cntCoolingEnergy" |
|
|
15
19
|
|
|
16
20
|
"coolingEnergyVolumeInInlet" |
|
|
17
21
|
"diffCoolingEnergyVolumeInInlet" |
|
|
22
|
+
"cntCoolingEnergyVolumeInInlet" |
|
|
18
23
|
|
|
19
24
|
"coolingEnergyVolumeInOutlet" |
|
|
20
25
|
"diffCoolingEnergyVolumeInOutlet" |
|
|
26
|
+
"cntCoolingEnergyVolumeInOutlet" |
|
|
21
27
|
|
|
22
28
|
"electricalEnergy" |
|
|
23
29
|
"diffElectricalEnergy" |
|
|
30
|
+
"cntElectricalEnergy" |
|
|
24
31
|
|
|
25
32
|
"reactiveEnergy" |
|
|
26
33
|
"diffReactiveEnergy" |
|
|
34
|
+
"cntReactiveEnergy" |
|
|
27
35
|
|
|
28
36
|
"volume" |
|
|
29
37
|
"diffVolume" |
|
|
38
|
+
"cntVolume" |
|
|
30
39
|
|
|
31
40
|
"inletVolume" |
|
|
32
41
|
"diffInletVolume" |
|
|
42
|
+
"cntInletVolume" |
|
|
33
43
|
|
|
34
44
|
"outletVolume" |
|
|
35
45
|
"diffOutletVolume" |
|
|
46
|
+
"cntOutletVolume" |
|
|
36
47
|
|
|
37
48
|
"pulseInputAVolume" |
|
|
38
49
|
"diffPulseInputAVolume" |
|
|
50
|
+
"cntPulseInputAVolume" |
|
|
39
51
|
|
|
40
52
|
"pulseInputBVolume" |
|
|
41
53
|
"diffPulseInputBVolume" |
|
|
54
|
+
"cntPulseInputBVolume" |
|
|
42
55
|
|
|
43
56
|
"mass" |
|
|
44
57
|
"diffMass" |
|
|
58
|
+
"cntMass" |
|
|
45
59
|
|
|
46
60
|
"inletMass" |
|
|
47
61
|
"diffInletMass" |
|
|
62
|
+
"cntInletMass" |
|
|
48
63
|
|
|
49
64
|
"outletMass" |
|
|
50
65
|
"diffOutletMass" |
|
|
66
|
+
"cntOutletMass" |
|
|
67
|
+
|
|
68
|
+
"pressure" |
|
|
69
|
+
"maxPressure" |
|
|
70
|
+
"minPressure" |
|
|
71
|
+
"avgPressure" |
|
|
72
|
+
"sumPressure" |
|
|
73
|
+
"cntPressure" |
|
|
74
|
+
"ssqPressure" |
|
|
75
|
+
|
|
76
|
+
"inletPressure" |
|
|
77
|
+
"maxInletPressure" |
|
|
78
|
+
"minInletPressure" |
|
|
79
|
+
"avgInletPressure" |
|
|
80
|
+
"sumInletPressure" |
|
|
81
|
+
"cntInletPressure" |
|
|
82
|
+
"ssqInletPressure" |
|
|
83
|
+
|
|
84
|
+
"outletPressure" |
|
|
85
|
+
"maxOutletPressure" |
|
|
86
|
+
"minOutletPressure" |
|
|
87
|
+
"avgOutletPressure" |
|
|
88
|
+
"sumOutletPressure" |
|
|
89
|
+
"cntOutletPressure" |
|
|
90
|
+
"ssqOutletPressure" |
|
|
51
91
|
|
|
52
92
|
"power" |
|
|
53
93
|
"maxPower" |
|
|
54
94
|
"minPower" |
|
|
55
95
|
"avgPower" |
|
|
96
|
+
"sumPower" |
|
|
97
|
+
"cntPower" |
|
|
98
|
+
"ssqPower" |
|
|
56
99
|
|
|
57
100
|
"inletPower" |
|
|
58
101
|
"maxInletPower" |
|
|
59
102
|
"minInletPower" |
|
|
60
103
|
"avgInletPower" |
|
|
104
|
+
"sumInletPower" |
|
|
105
|
+
"cntInletPower" |
|
|
106
|
+
"ssqInletPower" |
|
|
61
107
|
|
|
62
108
|
"outletPower" |
|
|
63
109
|
"maxOutletPower" |
|
|
64
110
|
"minOutletPower" |
|
|
65
111
|
"avgOutletPower" |
|
|
112
|
+
"sumOutletPower" |
|
|
113
|
+
"cntOutletPower" |
|
|
114
|
+
"ssqOutletPower" |
|
|
66
115
|
|
|
67
116
|
"volumeFlow" |
|
|
68
117
|
"maxVolumeFlow" |
|
|
69
118
|
"minVolumeFlow" |
|
|
70
119
|
"avgVolumeFlow" |
|
|
120
|
+
"sumVolumeFlow" |
|
|
121
|
+
"cntVolumeFlow" |
|
|
122
|
+
"ssqVolumeFlow" |
|
|
71
123
|
|
|
72
124
|
"inletVolumeFlow" |
|
|
73
125
|
"maxInletVolumeFlow" |
|
|
74
126
|
"minInletVolumeFlow" |
|
|
75
127
|
"avgInletVolumeFlow" |
|
|
128
|
+
"sumInletVolumeFlow" |
|
|
129
|
+
"cntInletVolumeFlow" |
|
|
130
|
+
"ssqInletVolumeFlow" |
|
|
76
131
|
|
|
77
132
|
"outletVolumeFlow" |
|
|
78
133
|
"maxOutletVolumeFlow" |
|
|
79
134
|
"minOutletVolumeFlow" |
|
|
80
135
|
"avgOutletVolumeFlow" |
|
|
136
|
+
"sumOutletVolumeFlow" |
|
|
137
|
+
"cntOutletVolumeFlow" |
|
|
138
|
+
"ssqOutletVolumeFlow" |
|
|
81
139
|
|
|
82
140
|
"massFlow" |
|
|
83
141
|
"maxMassFlow" |
|
|
84
142
|
"minMassFlow" |
|
|
85
143
|
"avgMassFlow" |
|
|
144
|
+
"sumMassFlow" |
|
|
145
|
+
"cntMassFlow" |
|
|
146
|
+
"ssqMassFlow" |
|
|
86
147
|
|
|
87
148
|
"inletMassFlow" |
|
|
88
149
|
"maxInletMassFlow" |
|
|
89
150
|
"minInletMassFlow" |
|
|
90
151
|
"avgInletMassFlow" |
|
|
152
|
+
"sumInletMassFlow" |
|
|
153
|
+
"cntInletMassFlow" |
|
|
154
|
+
"ssqInletMassFlow" |
|
|
91
155
|
|
|
92
156
|
"outletMassFlow" |
|
|
93
157
|
"maxOutletMassFlow" |
|
|
94
158
|
"minOutletMassFlow" |
|
|
95
159
|
"avgOutletMassFlow" |
|
|
160
|
+
"sumOutletMassFlow" |
|
|
161
|
+
"cntOutletMassFlow" |
|
|
162
|
+
"ssqOutletMassFlow" |
|
|
96
163
|
|
|
97
164
|
"flowTemperature" |
|
|
98
165
|
"maxFlowTemperature" |
|
|
99
166
|
"minFlowTemperature" |
|
|
100
167
|
"avgFlowTemperature" |
|
|
168
|
+
"sumFlowTemperature" |
|
|
169
|
+
"cntFlowTemperature" |
|
|
170
|
+
"ssqFlowTemperature" |
|
|
101
171
|
|
|
102
172
|
"inletFlowTemperature" |
|
|
103
173
|
"maxInletFlowTemperature" |
|
|
104
174
|
"minInletFlowTemperature" |
|
|
105
175
|
"avgInletFlowTemperature" |
|
|
176
|
+
"sumInletFlowTemperature" |
|
|
177
|
+
"cntInletFlowTemperature" |
|
|
178
|
+
"ssqInletFlowTemperature" |
|
|
106
179
|
|
|
107
180
|
"outletFlowTemperature" |
|
|
108
181
|
"maxOutletFlowTemperature" |
|
|
109
182
|
"minOutletFlowTemperature" |
|
|
110
183
|
"avgOutletFlowTemperature" |
|
|
184
|
+
"sumOutletFlowTemperature" |
|
|
185
|
+
"cntOutletFlowTemperature" |
|
|
186
|
+
"ssqOutletFlowTemperature" |
|
|
111
187
|
|
|
112
188
|
"inletMinusOutletFlowTemperatureDifference" |
|
|
113
189
|
"maxInletMinusOutletFlowTemperatureDifference" |
|
|
114
190
|
"minInletMinusOutletFlowTemperatureDifference" |
|
|
115
191
|
"avgInletMinusOutletFlowTemperatureDifference" |
|
|
192
|
+
"sumInletMinusOutletFlowTemperatureDifference" |
|
|
193
|
+
"cntInletMinusOutletFlowTemperatureDifference" |
|
|
194
|
+
"ssqInletMinusOutletFlowTemperatureDifference" |
|
|
116
195
|
|
|
117
196
|
"outletMinusInletFlowTemperatureDifference" |
|
|
118
197
|
"maxOutletMinusInletFlowTemperatureDifference" |
|
|
119
198
|
"minOutletMinusInletFlowTemperatureDifference" |
|
|
120
199
|
"avgOutletMinusInletFlowTemperatureDifference" |
|
|
200
|
+
"sumOutletMinusInletFlowTemperatureDifference" |
|
|
201
|
+
"cntOutletMinusInletFlowTemperatureDifference" |
|
|
202
|
+
"ssqOutletMinusInletFlowTemperatureDifference" |
|
|
121
203
|
|
|
122
204
|
"ambientTemperature" |
|
|
123
205
|
"maxAmbientTemperature" |
|
|
124
206
|
"minAmbientTemperature" |
|
|
125
207
|
"avgAmbientTemperature" |
|
|
208
|
+
"sumAmbientTemperature" |
|
|
209
|
+
"cntAmbientTemperature" |
|
|
210
|
+
"ssqAmbientTemperature" |
|
|
126
211
|
|
|
127
212
|
"radiatorTemperature" |
|
|
128
213
|
"maxRadiatorTemperature" |
|
|
129
214
|
"minRadiatorTemperature" |
|
|
130
215
|
"avgRadiatorTemperature" |
|
|
216
|
+
"sumRadiatorTemperature" |
|
|
217
|
+
"cntRadiatorTemperature" |
|
|
218
|
+
"ssqRadiatorTemperature" |
|
|
219
|
+
|
|
220
|
+
"auxFlowTemperature" |
|
|
221
|
+
"maxAuxFlowTemperature" |
|
|
222
|
+
"minAuxFlowTemperature" |
|
|
223
|
+
"avgAuxFlowTemperature" |
|
|
224
|
+
"sumAuxFlowTemperature" |
|
|
225
|
+
"cntAuxFlowTemperature" |
|
|
226
|
+
"ssqAuxFlowTemperature" |
|
|
131
227
|
|
|
132
228
|
"relativeHumidity" |
|
|
133
229
|
|
|
134
230
|
"kamstrupE8Inlet" |
|
|
135
231
|
"diffKamstrupE8Inlet" |
|
|
232
|
+
"cntKamstrupE8Inlet" |
|
|
136
233
|
"kamstrupE9Outlet" |
|
|
137
234
|
"diffKamstrupE9Outlet" |
|
|
235
|
+
"cntKamstrupE9Outlet" |
|
|
138
236
|
|
|
139
237
|
"operatingTime" |
|
|
140
238
|
"diffOperatingTime" |
|
|
239
|
+
"cntOperatingTime" |
|
|
240
|
+
|
|
241
|
+
"errorOperatingTime" |
|
|
242
|
+
"diffErrorOperatingTime" |
|
|
243
|
+
"cntErrorOperatingTime" |
|
|
141
244
|
|
|
142
245
|
"remainingBatteryTime" |
|
|
143
246
|
"diffRemainingBatteryTime" |
|
|
247
|
+
"cntRemainingBatteryTime" |
|
|
144
248
|
|
|
145
249
|
"deviceDate" |
|
|
146
250
|
"deviceTime" |
|
|
@@ -151,14 +255,19 @@ export type RegisterId =
|
|
|
151
255
|
|
|
152
256
|
"timeSinceLastPossibleCandidateOverhearingArrived" |
|
|
153
257
|
"timeAtLastPossibleCandidateOverhearingArrived" |
|
|
154
|
-
|
|
258
|
+
|
|
155
259
|
"timeSinceLastSampled" |
|
|
156
260
|
"timeAtLastSampled" |
|
|
157
|
-
|
|
261
|
+
|
|
158
262
|
"timeSinceLastInstallationMounted" |
|
|
159
263
|
"timeAtLastInstallationMounted" |
|
|
160
264
|
|
|
161
265
|
"basetime" |
|
|
266
|
+
"instantTime" |
|
|
267
|
+
"periodStartTime" |
|
|
268
|
+
"periodEndTime" |
|
|
269
|
+
"instantOrPeriodStartTime" |
|
|
270
|
+
"instantOrPeriodEndTime" |
|
|
162
271
|
|
|
163
272
|
"device" |
|
|
164
273
|
"wMBusDeviceAddresses" |
|
|
@@ -166,10 +275,13 @@ export type RegisterId =
|
|
|
166
275
|
"tchlrDeviceAddresses" |
|
|
167
276
|
"kamdaDeviceAddresses" |
|
|
168
277
|
"msisdnDeviceAddresses" |
|
|
278
|
+
|
|
169
279
|
"deviceRegisters" |
|
|
170
|
-
|
|
280
|
+
|
|
281
|
+
"place" |
|
|
171
282
|
|
|
172
283
|
"mBusFormatStringSignature" |
|
|
284
|
+
"deviceSoftwareVersion" |
|
|
173
285
|
|
|
174
286
|
"kamstrupMulticalInfocodeType1" |
|
|
175
287
|
"kamstrupMulticalInfocodeType2" |
|
|
@@ -177,7 +289,7 @@ export type RegisterId =
|
|
|
177
289
|
"kamstrupMulticalInfocodeType4" |
|
|
178
290
|
"kamstrupMulticalInfocode" |
|
|
179
291
|
"kamstrupModuleType" |
|
|
180
|
-
|
|
292
|
+
|
|
181
293
|
"diehlInfocodeType1" |
|
|
182
294
|
"diehlInfocode" |
|
|
183
295
|
|
|
@@ -187,5 +299,5 @@ export type RegisterId =
|
|
|
187
299
|
"landisGyrInfocodeType1" |
|
|
188
300
|
"landisGyrInfocodeType2" |
|
|
189
301
|
"landisGyrInfocode" |
|
|
190
|
-
|
|
191
|
-
"infocode";
|
|
302
|
+
|
|
303
|
+
"infocode";
|
|
@@ -1,33 +1,41 @@
|
|
|
1
|
-
import { expect } from "chai";
|
|
2
|
-
import { RegisterDefinition } from ".";
|
|
3
|
-
import { RegisterLibrary } from "./register-library";
|
|
4
|
-
|
|
5
|
-
const volume: RegisterDefinition = {
|
|
6
|
-
id: "volume",
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
1
|
+
import { expect } from "chai";
|
|
2
|
+
import { RegisterDefinition } from ".";
|
|
3
|
+
import { RegisterLibrary } from "./register-library";
|
|
4
|
+
|
|
5
|
+
const volume: RegisterDefinition = {
|
|
6
|
+
id: "volume",
|
|
7
|
+
measure: "volume",
|
|
8
|
+
aggregate: "instant",
|
|
9
|
+
units: ["cubicMeter"]
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
describe("library", () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
RegisterLibrary.reset();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should get added definition", () => {
|
|
18
|
+
RegisterLibrary.add(volume);
|
|
19
|
+
const definition = RegisterLibrary.get("volume");
|
|
20
|
+
expect(definition.id).to.equal("volume");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should add all definitions in pack", () => {
|
|
24
|
+
RegisterLibrary.add({
|
|
25
|
+
someRandomKey: volume
|
|
26
|
+
});
|
|
27
|
+
const definition = RegisterLibrary.get("volume");
|
|
28
|
+
expect(definition.id).to.equal("volume");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should throw when getting not added register", () => {
|
|
32
|
+
expect(() => RegisterLibrary.get("volume")).to.throw();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should return all definitions when invoking all()", () => {
|
|
36
|
+
RegisterLibrary.add(volume);
|
|
37
|
+
RegisterLibrary.add(volume); // Only added once.
|
|
38
|
+
const all = RegisterLibrary.all();
|
|
39
|
+
expect(all.length).to.equal(1);
|
|
40
|
+
})
|
|
41
|
+
});
|
package/src/register-library.ts
CHANGED
|
@@ -1,37 +1,57 @@
|
|
|
1
|
-
import { RegisterDefinition } from "./register-definition";
|
|
2
|
-
import { RegisterId } from "./register-id";
|
|
3
|
-
import { RegisterPack } from "./register-pack";
|
|
4
|
-
|
|
5
|
-
class Library {
|
|
6
|
-
private definitions: Partial<{ [id in RegisterId]: RegisterDefinition }> = {};
|
|
7
|
-
public add(...definitions: (RegisterDefinition | RegisterPack)[]) {
|
|
8
|
-
for (const definition of definitions) {
|
|
9
|
-
if (isDefinition(definition)) {
|
|
10
|
-
this.
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
for (const definitionInPack of Object.values(definition)) {
|
|
14
|
-
this.
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
return
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public
|
|
29
|
-
this.definitions
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
1
|
+
import { RegisterDefinition } from "./register-definition";
|
|
2
|
+
import { RegisterId } from "./register-id";
|
|
3
|
+
import { RegisterPack } from "./register-pack";
|
|
4
|
+
|
|
5
|
+
class Library {
|
|
6
|
+
private definitions: Partial<{ [id in RegisterId]: RegisterDefinition }> = {};
|
|
7
|
+
public add(...definitions: (RegisterDefinition | RegisterPack)[]) {
|
|
8
|
+
for (const definition of definitions) {
|
|
9
|
+
if (isDefinition(definition)) {
|
|
10
|
+
this.tryAdd(definition);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
for (const definitionInPack of Object.values(definition)) {
|
|
14
|
+
this.tryAdd(definitionInPack);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private tryAdd(definition: RegisterDefinition) {
|
|
21
|
+
if (!this.definitions[definition.id]) {
|
|
22
|
+
this.definitions[definition.id] = definition;
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public has(id: RegisterId) {
|
|
29
|
+
return !!this.definitions[id];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public tryGet(id: RegisterId) {
|
|
33
|
+
return this.definitions[id];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public get(id: RegisterId) {
|
|
37
|
+
const definition = this.definitions[id];
|
|
38
|
+
if (!definition) {
|
|
39
|
+
throw new Error(`Defintion was not loaded for register ${id}`);
|
|
40
|
+
}
|
|
41
|
+
return definition;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public all() {
|
|
45
|
+
return Object.values(this.definitions).map(x => x!);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public reset() {
|
|
49
|
+
this.definitions = {};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isDefinition(definitionOrPack: RegisterDefinition | RegisterPack): definitionOrPack is RegisterDefinition {
|
|
54
|
+
return !!(definitionOrPack.id && definitionOrPack.aggregate && definitionOrPack.units);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const RegisterLibrary = new Library();
|
package/src/register-pack.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RegisterDefinition } from "./register-definition";
|
|
2
|
-
|
|
3
|
-
export interface RegisterPack {
|
|
4
|
-
[key: string]: RegisterDefinition;
|
|
5
|
-
}
|
|
1
|
+
import { RegisterDefinition } from "./register-definition";
|
|
2
|
+
|
|
3
|
+
export interface RegisterPack {
|
|
4
|
+
[key: string]: RegisterDefinition;
|
|
5
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { expect } from "chai";
|
|
2
|
+
import { Repository } from "./repository";
|
|
3
|
+
|
|
4
|
+
describe("ctor", () => {
|
|
5
|
+
it("creates", () => {
|
|
6
|
+
expect(Repository("gpkv", "gjoel")).to.equal("gpkv/gjoel");
|
|
7
|
+
expect(Repository("gpkv/gjoel")).to.equal("gpkv/gjoel");
|
|
8
|
+
});
|
|
9
|
+
it("throws if wrong format", () => {
|
|
10
|
+
expect(() => Repository("invalid")).to.throw();
|
|
11
|
+
})
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
describe("split", () => {
|
|
15
|
+
it("splits into correct parts", () => {
|
|
16
|
+
const { team, name } = Repository.split(Repository("gpkv", "gjoel"));
|
|
17
|
+
expect(team).to.equal("gpkv");
|
|
18
|
+
expect(name).to.equal("gjoel");
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// This is clearly not correct but it provides some amazing type safety
|
|
2
|
+
export type Repository = "some/repo";
|
|
3
|
+
|
|
4
|
+
export function Repository(repo: string): Repository;
|
|
5
|
+
export function Repository(team: string, name: string): Repository;
|
|
6
|
+
export function Repository(repoOrTeam: string, name?: string): Repository {
|
|
7
|
+
if (name) {
|
|
8
|
+
return <Repository>`${repoOrTeam}/${name}`;
|
|
9
|
+
} else if (repoOrTeam.indexOf("/") > 0) {
|
|
10
|
+
return <Repository>repoOrTeam;
|
|
11
|
+
} else {
|
|
12
|
+
throw new TypeError("Invalid repository format");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export namespace Repository {
|
|
17
|
+
export function split(repo: Repository) {
|
|
18
|
+
const parts = repo.split("/");
|
|
19
|
+
return {
|
|
20
|
+
team: parts[0],
|
|
21
|
+
name: parts[1],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|