@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.
Files changed (161) hide show
  1. package/dist/cjs/aggregate-id.js +2 -2
  2. package/dist/cjs/consumption-type-id.js +2 -2
  3. package/dist/cjs/index.js +21 -9
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/measure-id.js +3 -0
  6. package/dist/cjs/measure-id.js.map +1 -0
  7. package/dist/cjs/number-formatter.js +81 -50
  8. package/dist/cjs/number-formatter.js.map +1 -1
  9. package/dist/cjs/number-formatter.spec.js +98 -0
  10. package/dist/cjs/number-formatter.spec.js.map +1 -0
  11. package/dist/cjs/optional.js +3 -0
  12. package/dist/cjs/optional.js.map +1 -0
  13. package/dist/cjs/precision-number.js +36 -0
  14. package/dist/cjs/precision-number.js.map +1 -0
  15. package/dist/cjs/precision-number.spec.js +27 -0
  16. package/dist/cjs/precision-number.spec.js.map +1 -0
  17. package/dist/cjs/register-convention.js +56 -0
  18. package/dist/cjs/register-convention.js.map +1 -0
  19. package/dist/cjs/register-convention.spec.js +39 -0
  20. package/dist/cjs/register-convention.spec.js.map +1 -0
  21. package/dist/cjs/register-definition.js +2 -2
  22. package/dist/cjs/register-id.js +2 -2
  23. package/dist/cjs/register-library.js +50 -41
  24. package/dist/cjs/register-library.js.map +1 -1
  25. package/dist/cjs/register-library.spec.js +36 -29
  26. package/dist/cjs/register-library.spec.js.map +1 -1
  27. package/dist/cjs/register-pack.js +2 -2
  28. package/dist/cjs/register-utils.js +8 -0
  29. package/dist/cjs/register-utils.js.map +1 -0
  30. package/dist/cjs/repository.js +26 -0
  31. package/dist/cjs/repository.js.map +1 -0
  32. package/dist/cjs/repository.spec.js +21 -0
  33. package/dist/cjs/repository.spec.js.map +1 -0
  34. package/dist/cjs/step.js +41 -0
  35. package/dist/cjs/step.js.map +1 -0
  36. package/dist/cjs/step.spec.js +29 -0
  37. package/dist/cjs/step.spec.js.map +1 -0
  38. package/dist/cjs/time-or-rule.js +19 -0
  39. package/dist/cjs/time-or-rule.js.map +1 -0
  40. package/dist/cjs/unit-id.js +13 -13
  41. package/dist/cjs/unit-id.js.map +1 -1
  42. package/dist/esm/aggregate-id.d.ts +1 -1
  43. package/dist/esm/aggregate-id.js +1 -1
  44. package/dist/esm/consumption-type-id.d.ts +1 -1
  45. package/dist/esm/consumption-type-id.js +1 -1
  46. package/dist/esm/index.d.ts +16 -8
  47. package/dist/esm/index.js +9 -4
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/esm/measure-id.d.ts +1 -0
  50. package/dist/esm/measure-id.js +2 -0
  51. package/dist/esm/measure-id.js.map +1 -0
  52. package/dist/esm/number-formatter.d.ts +17 -8
  53. package/dist/esm/number-formatter.js +78 -47
  54. package/dist/esm/number-formatter.js.map +1 -1
  55. package/dist/esm/{register-converter.spec.d.ts → number-formatter.spec.d.ts} +1 -1
  56. package/dist/esm/number-formatter.spec.js +96 -0
  57. package/dist/esm/number-formatter.spec.js.map +1 -0
  58. package/dist/esm/optional.d.ts +1 -0
  59. package/dist/esm/optional.js +2 -0
  60. package/dist/esm/optional.js.map +1 -0
  61. package/dist/esm/precision-number.d.ts +11 -0
  62. package/dist/esm/precision-number.js +32 -0
  63. package/dist/esm/precision-number.js.map +1 -0
  64. package/dist/esm/precision-number.spec.d.ts +1 -0
  65. package/dist/esm/precision-number.spec.js +25 -0
  66. package/dist/esm/precision-number.spec.js.map +1 -0
  67. package/dist/esm/register-convention.d.ts +14 -0
  68. package/dist/esm/register-convention.js +52 -0
  69. package/dist/esm/register-convention.js.map +1 -0
  70. package/dist/esm/register-convention.spec.d.ts +1 -0
  71. package/dist/esm/register-convention.spec.js +37 -0
  72. package/dist/esm/register-convention.spec.js.map +1 -0
  73. package/dist/esm/register-definition.d.ts +13 -9
  74. package/dist/esm/register-definition.js +1 -1
  75. package/dist/esm/register-id.d.ts +1 -1
  76. package/dist/esm/register-id.js +1 -1
  77. package/dist/esm/register-library.d.ts +15 -11
  78. package/dist/esm/register-library.js +47 -38
  79. package/dist/esm/register-library.js.map +1 -1
  80. package/dist/esm/register-library.spec.d.ts +1 -1
  81. package/dist/esm/register-library.spec.js +34 -27
  82. package/dist/esm/register-library.spec.js.map +1 -1
  83. package/dist/esm/register-pack.d.ts +4 -4
  84. package/dist/esm/register-pack.js +1 -1
  85. package/dist/esm/register-utils.d.ts +3 -0
  86. package/dist/esm/register-utils.js +4 -0
  87. package/dist/esm/register-utils.js.map +1 -0
  88. package/dist/esm/repository.d.ts +9 -0
  89. package/dist/esm/repository.js +22 -0
  90. package/dist/esm/repository.js.map +1 -0
  91. package/dist/esm/repository.spec.d.ts +1 -0
  92. package/dist/esm/repository.spec.js +19 -0
  93. package/dist/esm/repository.spec.js.map +1 -0
  94. package/dist/esm/step.d.ts +15 -0
  95. package/dist/esm/step.js +38 -0
  96. package/dist/esm/step.js.map +1 -0
  97. package/dist/esm/step.spec.d.ts +1 -0
  98. package/dist/esm/step.spec.js +27 -0
  99. package/dist/esm/step.spec.js.map +1 -0
  100. package/dist/esm/time-or-rule.d.ts +7 -0
  101. package/dist/esm/time-or-rule.js +16 -0
  102. package/dist/esm/time-or-rule.js.map +1 -0
  103. package/dist/esm/unit-id.d.ts +2 -2
  104. package/dist/esm/unit-id.js +10 -10
  105. package/dist/esm/unit-id.js.map +1 -1
  106. package/karma.config.js +14 -14
  107. package/locales/da/aggregates.json +8 -0
  108. package/locales/da/consumption-types.json +7 -0
  109. package/locales/da/measures.json +16 -0
  110. package/locales/da/registers.json +221 -0
  111. package/locales/da/units.json +93 -0
  112. package/locales/en/aggregates.json +8 -0
  113. package/locales/en/consumption-types.json +7 -0
  114. package/locales/en/measures.json +16 -0
  115. package/locales/en/registers.json +221 -0
  116. package/locales/en/units.json +93 -0
  117. package/package.json +13 -6
  118. package/src/aggregate-id.ts +9 -9
  119. package/src/consumption-type-id.ts +8 -8
  120. package/src/index.ts +29 -11
  121. package/src/measure-id.ts +15 -0
  122. package/src/number-formatter.spec.ts +105 -77
  123. package/src/number-formatter.ts +95 -50
  124. package/src/optional.ts +1 -0
  125. package/src/precision-number.spec.ts +28 -0
  126. package/src/precision-number.ts +36 -0
  127. package/src/register-convention.spec.ts +43 -0
  128. package/src/register-convention.ts +61 -0
  129. package/src/register-definition.ts +14 -1
  130. package/src/register-id.ts +119 -7
  131. package/src/register-library.spec.ts +41 -33
  132. package/src/register-library.ts +57 -37
  133. package/src/register-pack.ts +5 -5
  134. package/src/register-utils.ts +6 -0
  135. package/src/repository.spec.ts +20 -0
  136. package/src/repository.ts +24 -0
  137. package/src/step.spec.ts +30 -0
  138. package/src/step.ts +37 -0
  139. package/src/time-or-rule.ts +17 -0
  140. package/src/unit-id.ts +131 -100
  141. package/tsconfig.cjs.json +7 -8
  142. package/tsconfig.json +15 -14
  143. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/base.css +0 -224
  144. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/block-navigation.js +0 -79
  145. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/favicon.png +0 -0
  146. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/index.html +0 -96
  147. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/prettify.css +0 -1
  148. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/prettify.js +0 -2
  149. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/sort-arrow-sprite.png +0 -0
  150. package/coverage/Chrome Headless 90.0.4430.85 (Windows 10)/html/sorter.js +0 -170
  151. package/dist/cjs/register-converter.js +0 -47
  152. package/dist/cjs/register-converter.js.map +0 -1
  153. package/dist/cjs/register-converter.spec.js +0 -29
  154. package/dist/cjs/register-converter.spec.js.map +0 -1
  155. package/dist/esm/register-converter.d.ts +0 -9
  156. package/dist/esm/register-converter.js +0 -44
  157. package/dist/esm/register-converter.js.map +0 -1
  158. package/dist/esm/register-converter.spec.js +0 -27
  159. package/dist/esm/register-converter.spec.js.map +0 -1
  160. package/src/register-converter.spec.ts +0 -31
  161. 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
+ }
@@ -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
- "consumptionZone" |
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
- aggregate: "instant",
8
- units: ["cubicMeter"]
9
- };
10
-
11
- describe("library", () => {
12
- beforeEach(() => {
13
- RegisterLibrary.reset();
14
- });
15
-
16
- it("should get added definition", () => {
17
- RegisterLibrary.add(volume);
18
- const definition = RegisterLibrary.get("volume");
19
- expect(definition.id).to.equal("volume");
20
- });
21
-
22
- it("should add all definitions in pack", () => {
23
- RegisterLibrary.add({
24
- someRandomKey: volume
25
- });
26
- const definition = RegisterLibrary.get("volume");
27
- expect(definition.id).to.equal("volume");
28
- });
29
-
30
- it("should throw when getting not added register", () => {
31
- expect(() => RegisterLibrary.get("volume")).to.throw();
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
+ });
@@ -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.definitions[definition.id] = definition;
11
- }
12
- else {
13
- for (const definitionInPack of Object.values(definition)) {
14
- this.definitions[definitionInPack.id] = definitionInPack;
15
- }
16
- }
17
- }
18
- }
19
-
20
- public get(id: RegisterId) {
21
- const definition = this.definitions[id];
22
- if (!definition) {
23
- throw new Error(`Defintion was not loaded for register ${id}`);
24
- }
25
- return definition;
26
- }
27
-
28
- public reset() {
29
- this.definitions = {};
30
- }
31
- }
32
-
33
- function isDefinition(definitionOrPack: RegisterDefinition | RegisterPack): definitionOrPack is RegisterDefinition {
34
- return !!(definitionOrPack.id && definitionOrPack.aggregate && definitionOrPack.units);
35
- }
36
-
37
- export const RegisterLibrary = new Library();
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();
@@ -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,6 @@
1
+ import { RegisterDefinition } from "./register-definition";
2
+ import { RegisterId } from "./register-id";
3
+
4
+ export function getRegisterId(register: RegisterId | RegisterDefinition) {
5
+ return typeof register === "string" ? register : register.id;
6
+ }
@@ -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
+ }