@powercalc/power-router 1.0.52 → 1.0.53
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/controllers/LoadAndParse.d.ts +10 -0
- package/dist/controllers/LoadAndParse.js +54 -0
- package/dist/controllers/LoadAndParse.js.map +1 -0
- package/dist/controllers/Router.d.ts +7 -0
- package/dist/controllers/Router.js +103 -0
- package/dist/controllers/Router.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/config.d.ts +5 -0
- package/dist/interfaces/config.js +2 -0
- package/dist/interfaces/config.js.map +1 -0
- package/dist/interfaces/entsoe.d.ts +50 -0
- package/dist/interfaces/entsoe.js +2 -0
- package/dist/interfaces/entsoe.js.map +1 -0
- package/dist/interfaces/queryoptions.d.ts +15 -0
- package/dist/interfaces/queryoptions.js +13 -0
- package/dist/interfaces/queryoptions.js.map +1 -0
- package/dist/interfaces/types.d.ts +12 -0
- package/dist/interfaces/types.js +2 -0
- package/dist/interfaces/types.js.map +1 -0
- package/dist/services/CommonTimestamps.d.ts +15 -0
- package/dist/services/CommonTimestamps.js +173 -0
- package/dist/services/CommonTimestamps.js.map +1 -0
- package/dist/services/Eurostat.d.ts +10 -0
- package/dist/services/Eurostat.js +65 -0
- package/dist/services/Eurostat.js.map +1 -0
- package/dist/services/LoadService.d.ts +27 -0
- package/dist/services/LoadService.js +79 -0
- package/dist/services/LoadService.js.map +1 -0
- package/dist/services/Loader.d.ts +38 -0
- package/dist/services/Loader.js +116 -0
- package/dist/services/Loader.js.map +1 -0
- package/dist/services/ParseEdifact.d.ts +28 -0
- package/dist/services/ParseEdifact.js +155 -0
- package/dist/services/ParseEdifact.js.map +1 -0
- package/dist/services/ParseInstalled.d.ts +9 -0
- package/dist/services/ParseInstalled.js +42 -0
- package/dist/services/ParseInstalled.js.map +1 -0
- package/dist/services/batch/maxHydrofill.d.ts +10 -0
- package/dist/services/batch/maxHydrofill.js +62 -0
- package/dist/services/batch/maxHydrofill.js.map +1 -0
- package/package.json +8 -8
- package/dist-build/index.js +0 -6
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { LoadService } from '../services/LoadService';
|
|
3
|
+
import { Config } from '../interfaces/config';
|
|
4
|
+
export declare class LoadAndParse {
|
|
5
|
+
country: string;
|
|
6
|
+
private countries;
|
|
7
|
+
loadService: LoadService;
|
|
8
|
+
constructor(config: Config);
|
|
9
|
+
get(req: Request, chartType: string): Promise<any>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { LoadService } from '../services/LoadService';
|
|
4
|
+
import { Format, PosNeg } from '../interfaces/queryoptions';
|
|
5
|
+
export class LoadAndParse {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.country = '';
|
|
8
|
+
const countriesFile = join(__dirname, '../config/countries.json'); // Set the path to your config file
|
|
9
|
+
this.countries = JSON.parse(readFileSync(countriesFile, 'utf8')); // Read the config file from disk
|
|
10
|
+
this.loadService = new LoadService(config);
|
|
11
|
+
}
|
|
12
|
+
async get(req, chartType) {
|
|
13
|
+
var _a;
|
|
14
|
+
const country = req.params.country;
|
|
15
|
+
if (this.country !== country) {
|
|
16
|
+
//console.log(`=========== ${country} =============`)
|
|
17
|
+
this.country = country;
|
|
18
|
+
}
|
|
19
|
+
const queryOptions = {};
|
|
20
|
+
const year = parseInt(req.params.year);
|
|
21
|
+
const month = parseInt(req.params.month);
|
|
22
|
+
if (req.query.posneg === PosNeg.POS || req.query.posneg === PosNeg.NEG) {
|
|
23
|
+
queryOptions.posneg = req.query.posneg;
|
|
24
|
+
}
|
|
25
|
+
if (typeof (req.query.format) === 'string' && Object.values(Format).includes(req.query.format)) {
|
|
26
|
+
queryOptions.format = req.query.format;
|
|
27
|
+
}
|
|
28
|
+
let reload = false;
|
|
29
|
+
if (typeof (req.headers.reload) === 'string') {
|
|
30
|
+
reload = true;
|
|
31
|
+
queryOptions.reload = true;
|
|
32
|
+
}
|
|
33
|
+
const countryCode = (_a = this.countries.find(item => item.name === country)) === null || _a === void 0 ? void 0 : _a.code;
|
|
34
|
+
if (!countryCode) {
|
|
35
|
+
throw new Error('Unknown country ' + country);
|
|
36
|
+
}
|
|
37
|
+
if (chartType === 'installed') {
|
|
38
|
+
return await this.loadService.getInstalled(countryCode, reload);
|
|
39
|
+
}
|
|
40
|
+
if (chartType === 'power') {
|
|
41
|
+
return await this.loadService.getPower(countryCode, year, month, queryOptions);
|
|
42
|
+
}
|
|
43
|
+
if (chartType === 'hydrofill') {
|
|
44
|
+
return await this.loadService.getHydrofill(countryCode, reload);
|
|
45
|
+
}
|
|
46
|
+
if (chartType === 'fossil') {
|
|
47
|
+
return await this.loadService.getFossil(countryCode);
|
|
48
|
+
}
|
|
49
|
+
if (chartType === 'countrydata') {
|
|
50
|
+
return await this.loadService.getCountrydata(countryCode, reload);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=LoadAndParse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadAndParse.js","sourceRoot":"","sources":["../../src/router/controllers/LoadAndParse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Router, Request, Response } from 'express';
|
|
2
|
+
import { Config } from '../interfaces/config';
|
|
3
|
+
export declare class PowerRouter {
|
|
4
|
+
static init(config: Config): Router;
|
|
5
|
+
static load(config: Config, req: Request, res: Response, type: string): Promise<void>;
|
|
6
|
+
static calcCacheTime(req: Request): number;
|
|
7
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { stat, writeFile } from 'fs/promises';
|
|
4
|
+
import { gzipSync } from 'zlib';
|
|
5
|
+
import { Buffer } from 'node:buffer';
|
|
6
|
+
import { createReadStream } from 'fs';
|
|
7
|
+
import { LoadAndParse } from './LoadAndParse';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
export class PowerRouter {
|
|
10
|
+
static init(config) {
|
|
11
|
+
console.log('init', config);
|
|
12
|
+
const router = Router();
|
|
13
|
+
router.get(`/:country/:year/:month`, async (req, res) => {
|
|
14
|
+
await this.load(config, req, res, 'power');
|
|
15
|
+
});
|
|
16
|
+
router.get(`/:country/fossil`, async (req, res) => {
|
|
17
|
+
await this.load(config, req, res, 'fossil');
|
|
18
|
+
});
|
|
19
|
+
router.get(`/:country/installed`, async (req, res) => {
|
|
20
|
+
await this.load(config, req, res, 'installed');
|
|
21
|
+
});
|
|
22
|
+
router.get(`/:country/hydrofill`, async (req, res) => {
|
|
23
|
+
await this.load(config, req, res, 'hydrofill');
|
|
24
|
+
});
|
|
25
|
+
router.get(`/:country/countrydata`, async (req, res) => {
|
|
26
|
+
await this.load(config, req, res, 'countrydata');
|
|
27
|
+
});
|
|
28
|
+
router.get('/types', async (req, res) => {
|
|
29
|
+
const filePath = join(__dirname, '..', 'config', 'types.json');
|
|
30
|
+
res.set({ 'Cache-Control': 'max-age=86400' });
|
|
31
|
+
res.sendFile(filePath);
|
|
32
|
+
});
|
|
33
|
+
router.get('/countries', async (req, res) => {
|
|
34
|
+
const filePath = join(__dirname, '..', 'config', 'countrydata.json');
|
|
35
|
+
res.set({ 'Cache-Control': 'max-age=86400' });
|
|
36
|
+
res.sendFile(filePath);
|
|
37
|
+
});
|
|
38
|
+
return router;
|
|
39
|
+
}
|
|
40
|
+
static async load(config, req, res, type) {
|
|
41
|
+
const entsoeLoader = new LoadAndParse(config);
|
|
42
|
+
const cacheTime = this.calcCacheTime(req);
|
|
43
|
+
const successHeaders = {
|
|
44
|
+
'Cache-Control': `public, max-age=${cacheTime}`,
|
|
45
|
+
'Content-Encoding': 'gzip',
|
|
46
|
+
'Content-Type': 'application/json'
|
|
47
|
+
};
|
|
48
|
+
try {
|
|
49
|
+
let cacheData;
|
|
50
|
+
const cacheKey = req.url;
|
|
51
|
+
const cacheFilePath = `${config.cacheDir}/json.gz/${createHash('md5').update(cacheKey).digest('hex')}.json.gz`;
|
|
52
|
+
if (!(req.headers['reload'] === 'full')) {
|
|
53
|
+
// check if there is a cache file for this request
|
|
54
|
+
try {
|
|
55
|
+
const stats = await stat(cacheFilePath);
|
|
56
|
+
const modtime = stats.mtime.getTime();
|
|
57
|
+
// Check if the If-Modified-Since header matches the last modified date
|
|
58
|
+
const ifModifiedSince = req.headers['if-modified-since'];
|
|
59
|
+
if (ifModifiedSince && (modtime - new Date(ifModifiedSince).getTime()) < 5000) {
|
|
60
|
+
res.status(304).end();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
res.setHeader('Last-Modified', (new Date(modtime)).toUTCString());
|
|
64
|
+
res.set(successHeaders);
|
|
65
|
+
// console.log('cached')
|
|
66
|
+
createReadStream(cacheFilePath)
|
|
67
|
+
.pipe(res);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
// no cache file found, continue with request
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// if no cache hit, load data and store in cache
|
|
75
|
+
if (!cacheData) {
|
|
76
|
+
// LOAD THE DATA FROM SOURCE
|
|
77
|
+
const body = await entsoeLoader.get(req, type);
|
|
78
|
+
const buf = Buffer.from(JSON.stringify(body), 'utf-8');
|
|
79
|
+
const cacheDataBuffer = gzipSync(buf);
|
|
80
|
+
//await mkdir(basename(cacheFilePath), {recursive:true});
|
|
81
|
+
await writeFile(cacheFilePath, cacheDataBuffer, 'utf-8');
|
|
82
|
+
res.setHeader('Last-Modified', (new Date()).toUTCString());
|
|
83
|
+
res.set(successHeaders);
|
|
84
|
+
res.send(cacheDataBuffer);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
console.log(e);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
static calcCacheTime(req) {
|
|
92
|
+
const reqMonth = `${req.params.year} ${req.params.month}`;
|
|
93
|
+
const now = new Date();
|
|
94
|
+
const nowMonth = `${now.getFullYear()} ${now.getMonth() + 1}`;
|
|
95
|
+
if (reqMonth === nowMonth) {
|
|
96
|
+
return 5 * 60;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return 3600 * 7;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=Router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Router.js","sourceRoot":"","sources":["../../src/router/controllers/Router.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/router/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/router/interfaces/config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface Entsoe {
|
|
2
|
+
GL_MarketDocument?: EntsoeDocument;
|
|
3
|
+
Publication_MarketDocument?: EntsoeDocument;
|
|
4
|
+
Acknowledgement_MarketDocument?: ErrorDocument;
|
|
5
|
+
}
|
|
6
|
+
export interface EntsoeDocument {
|
|
7
|
+
TimeSeries: TimeSeries[];
|
|
8
|
+
'period.timeInterval'?: TimeInterval[];
|
|
9
|
+
'time_Period.timeInterval'?: TimeInterval[];
|
|
10
|
+
type?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface TimeSeries {
|
|
13
|
+
Period: EntsoePeriod[];
|
|
14
|
+
MktPSRType?: MktPSRType[];
|
|
15
|
+
'outBiddingZone_Domain.mRID': string;
|
|
16
|
+
}
|
|
17
|
+
export interface EntsoePeriod {
|
|
18
|
+
Point: EntsoePoint[];
|
|
19
|
+
resolution: string;
|
|
20
|
+
timeInterval: TimeInterval[];
|
|
21
|
+
}
|
|
22
|
+
interface TimeInterval {
|
|
23
|
+
start: string[];
|
|
24
|
+
end: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface MktPSRType {
|
|
27
|
+
psrType?: string[];
|
|
28
|
+
PowerSystemResources?: PowerSystemResource[];
|
|
29
|
+
}
|
|
30
|
+
export interface EntsoePoint {
|
|
31
|
+
position: string[];
|
|
32
|
+
quantity?: string[];
|
|
33
|
+
'price.amount'?: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface PowerSystemResource {
|
|
36
|
+
mRID: mRID[];
|
|
37
|
+
name: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface mRID {
|
|
40
|
+
_: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ErrorDocument {
|
|
43
|
+
mRID: string;
|
|
44
|
+
Reason: Reason[];
|
|
45
|
+
}
|
|
46
|
+
interface Reason {
|
|
47
|
+
code: string[];
|
|
48
|
+
text: string[];
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entsoe.js","sourceRoot":"","sources":["../../src/router/interfaces/entsoe.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface QueryOptions {
|
|
2
|
+
reload?: boolean;
|
|
3
|
+
format?: Format;
|
|
4
|
+
posneg?: PosNeg;
|
|
5
|
+
}
|
|
6
|
+
export declare enum Format {
|
|
7
|
+
EDIFACT = "edifact",
|
|
8
|
+
EDIJSON = "edijson",
|
|
9
|
+
SOURCES = "sources",
|
|
10
|
+
KEYVALUE = "keyvalue"
|
|
11
|
+
}
|
|
12
|
+
export declare enum PosNeg {
|
|
13
|
+
POS = "pos",
|
|
14
|
+
NEG = "neg"
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export var Format;
|
|
2
|
+
(function (Format) {
|
|
3
|
+
Format["EDIFACT"] = "edifact";
|
|
4
|
+
Format["EDIJSON"] = "edijson";
|
|
5
|
+
Format["SOURCES"] = "sources";
|
|
6
|
+
Format["KEYVALUE"] = "keyvalue";
|
|
7
|
+
})(Format || (Format = {}));
|
|
8
|
+
export var PosNeg;
|
|
9
|
+
(function (PosNeg) {
|
|
10
|
+
PosNeg["POS"] = "pos";
|
|
11
|
+
PosNeg["NEG"] = "neg";
|
|
12
|
+
})(PosNeg || (PosNeg = {}));
|
|
13
|
+
//# sourceMappingURL=queryoptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryoptions.js","sourceRoot":"","sources":["../../src/router/interfaces/queryoptions.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,MAKX;AALD,WAAY,MAAM;IACd,6BAAmB,CAAA;IACnB,6BAAmB,CAAA;IACnB,6BAAmB,CAAA;IACnB,+BAAqB,CAAA;AACzB,CAAC,EALW,MAAM,KAAN,MAAM,QAKjB;AACD,MAAM,CAAN,IAAY,MAGX;AAHD,WAAY,MAAM;IACd,qBAAW,CAAA;IACX,qBAAW,CAAA;AACf,CAAC,EAHW,MAAM,KAAN,MAAM,QAGjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/interfaces/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AllInResulotions, DataPoint, DataPointResolutions } from "./ParseEdifact";
|
|
2
|
+
export interface Result {
|
|
3
|
+
[key: string]: (number | null)[];
|
|
4
|
+
}
|
|
5
|
+
export declare class CommonTimestamps {
|
|
6
|
+
static transform(all: AllInResulotions, startMonth: string, endMonth: string): Result;
|
|
7
|
+
static makeCommonTimeBase(all: DataPointResolutions, newTimes: number[], best: string): (number | null)[] | undefined;
|
|
8
|
+
static shouldMerge(all: DataPointResolutions): boolean;
|
|
9
|
+
static interpolate(all: DataPointResolutions, newTimes: number[]): (number | null)[] | undefined;
|
|
10
|
+
private static findTime;
|
|
11
|
+
static makeNumbers(all: DataPoint[], newTimes: number[]): (number | null)[];
|
|
12
|
+
static makeTimeArray(startIsoString: string, endIsoString: string, resolution: string): number[];
|
|
13
|
+
static best(all: any): string;
|
|
14
|
+
static bestResolution(all: any): string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { DateTime, Duration } from "luxon";
|
|
2
|
+
export class CommonTimestamps {
|
|
3
|
+
static transform(all, startMonth, endMonth) {
|
|
4
|
+
const best = this.bestResolution(all);
|
|
5
|
+
const time = this.makeTimeArray(startMonth, endMonth, best);
|
|
6
|
+
const result = {
|
|
7
|
+
time: time,
|
|
8
|
+
};
|
|
9
|
+
Object.keys(all).forEach((key) => {
|
|
10
|
+
const item = all[key];
|
|
11
|
+
const interpolated = this.makeCommonTimeBase(item, time, best);
|
|
12
|
+
if (interpolated) {
|
|
13
|
+
result[key] = interpolated;
|
|
14
|
+
}
|
|
15
|
+
if (key === "price") {
|
|
16
|
+
if (item["PT15M"] && item["PT60M"]) {
|
|
17
|
+
result["price15m"] = result['price'];
|
|
18
|
+
delete item['PT15M'];
|
|
19
|
+
const price60 = this.makeCommonTimeBase(item, time, best);
|
|
20
|
+
if (price60) {
|
|
21
|
+
result['price'] = price60;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
// console.log(Object.keys(result))
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
static makeCommonTimeBase(all, newTimes, best) {
|
|
30
|
+
const haveToMerge = this.shouldMerge(all);
|
|
31
|
+
if (haveToMerge) {
|
|
32
|
+
const all2 = {};
|
|
33
|
+
all2[best] = [];
|
|
34
|
+
const keys = Object.keys(all);
|
|
35
|
+
keys.forEach((key) => {
|
|
36
|
+
all2[best] = all2[best].concat(all[key]);
|
|
37
|
+
});
|
|
38
|
+
all2[best] = all2[best].sort((a, b) => a.time - b.time);
|
|
39
|
+
return this.interpolate(all2, newTimes);
|
|
40
|
+
}
|
|
41
|
+
const data = all[best];
|
|
42
|
+
if (data) {
|
|
43
|
+
return this.makeNumbers(data, newTimes);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return this.interpolate(all, newTimes);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
static shouldMerge(all) {
|
|
50
|
+
let start = 0;
|
|
51
|
+
let end = 0;
|
|
52
|
+
const keys = Object.keys(all);
|
|
53
|
+
if (keys.length < 2) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
let shouldMerge = true;
|
|
57
|
+
keys.forEach((key) => {
|
|
58
|
+
const times = all[key].map((item) => item.time);
|
|
59
|
+
if (start && end && start > times[0] && end < times[times.length - 1]) {
|
|
60
|
+
shouldMerge = false;
|
|
61
|
+
}
|
|
62
|
+
start = times[0];
|
|
63
|
+
end = times[times.length - 1];
|
|
64
|
+
});
|
|
65
|
+
return shouldMerge;
|
|
66
|
+
}
|
|
67
|
+
static interpolate(all, newTimes) {
|
|
68
|
+
const best = this.best(all);
|
|
69
|
+
const dur = Duration.fromISO(best).as("milliseconds");
|
|
70
|
+
const data = all[best];
|
|
71
|
+
const sourceTimes = data.map((item) => item.time);
|
|
72
|
+
const result = new Array(newTimes.length);
|
|
73
|
+
newTimes.forEach((time, i) => {
|
|
74
|
+
if (time > data[data.length - 1].time) {
|
|
75
|
+
return true; //break
|
|
76
|
+
}
|
|
77
|
+
const lohi = this.findTime(sourceTimes, time);
|
|
78
|
+
const lo = data[lohi[0]];
|
|
79
|
+
const hi = data[lohi[1]];
|
|
80
|
+
const delta = hi.value - lo.value;
|
|
81
|
+
const timeDelta = hi.time - lo.time;
|
|
82
|
+
const timeFactor = (time - lo.time) / timeDelta;
|
|
83
|
+
if (timeDelta > 3600000 && dur * 1.5 < timeDelta) {
|
|
84
|
+
// interpolate everything that's smaller than 61 minutes
|
|
85
|
+
result[i] = null;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
result[i] = lo.value + delta * timeFactor;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
static findTime(arr, num) {
|
|
94
|
+
let lo = 0;
|
|
95
|
+
let hi = arr.length - 1;
|
|
96
|
+
if (arr.length === 1) {
|
|
97
|
+
return [0, 0];
|
|
98
|
+
}
|
|
99
|
+
if (arr[lo] > num) {
|
|
100
|
+
return [lo, lo + 1];
|
|
101
|
+
}
|
|
102
|
+
if (arr[hi] < num) {
|
|
103
|
+
return [hi - 1, hi];
|
|
104
|
+
}
|
|
105
|
+
while (hi - lo > 1) {
|
|
106
|
+
const mid = Math.trunc((lo + hi) / 2);
|
|
107
|
+
if (arr[mid] < num) {
|
|
108
|
+
lo = mid;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
hi = mid;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return [lo, hi];
|
|
115
|
+
}
|
|
116
|
+
static makeNumbers(all, newTimes) {
|
|
117
|
+
const result = [];
|
|
118
|
+
newTimes.forEach((time) => {
|
|
119
|
+
var _a;
|
|
120
|
+
const num = ((_a = all.find((item) => item.time === time)) === null || _a === void 0 ? void 0 : _a.value) || null;
|
|
121
|
+
result.push(num);
|
|
122
|
+
});
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
static makeTimeArray(startIsoString, endIsoString, resolution) {
|
|
126
|
+
const duration = Duration.fromISO(resolution).toMillis();
|
|
127
|
+
const localStartTime = DateTime.fromISO(startIsoString);
|
|
128
|
+
const localEndTime = DateTime.fromISO(endIsoString);
|
|
129
|
+
// Convert start and end time to UTC time using Luxon
|
|
130
|
+
const utcStartTime = localStartTime.toUTC();
|
|
131
|
+
const utcEndTime = localEndTime.toUTC();
|
|
132
|
+
// Calculate time distance in milliseconds
|
|
133
|
+
const timeDistance = utcEndTime.toMillis() - utcStartTime.toMillis();
|
|
134
|
+
// Create an array with time distance duration in UTC time using Luxon
|
|
135
|
+
const timeSteps = [];
|
|
136
|
+
for (let i = 0; i <= timeDistance; i += duration) {
|
|
137
|
+
const dur = utcStartTime.plus({ milliseconds: i });
|
|
138
|
+
timeSteps.push(dur.toUnixInteger() * 1000);
|
|
139
|
+
}
|
|
140
|
+
if (timeSteps.length > 1) {
|
|
141
|
+
timeSteps.pop();
|
|
142
|
+
}
|
|
143
|
+
return timeSteps;
|
|
144
|
+
}
|
|
145
|
+
static best(all) {
|
|
146
|
+
let min = Infinity;
|
|
147
|
+
let minPeriod = "";
|
|
148
|
+
const keys = Object.keys(all);
|
|
149
|
+
keys.forEach((period) => {
|
|
150
|
+
const dur = Duration.fromISO(period);
|
|
151
|
+
if (dur.as("minutes") < min) {
|
|
152
|
+
min = dur.as("minutes");
|
|
153
|
+
minPeriod = period;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return minPeriod;
|
|
157
|
+
}
|
|
158
|
+
static bestResolution(all) {
|
|
159
|
+
let min = Infinity;
|
|
160
|
+
let minPeriod = "";
|
|
161
|
+
Object.keys(all).forEach((key) => {
|
|
162
|
+
Object.keys(all[key]).forEach((period) => {
|
|
163
|
+
const dur = Duration.fromISO(period);
|
|
164
|
+
if (dur.as("minutes") < min) {
|
|
165
|
+
min = dur.as("minutes");
|
|
166
|
+
minPeriod = period;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
return minPeriod;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=CommonTimestamps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommonTimestamps.js","sourceRoot":"","sources":["../../src/router/services/CommonTimestamps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Country } from "./Loader";
|
|
2
|
+
export declare class EurostatAPI {
|
|
3
|
+
countries: Country[];
|
|
4
|
+
constructor();
|
|
5
|
+
private fuels;
|
|
6
|
+
private energyConversionFactors;
|
|
7
|
+
convertToMWh(value: number, unit: string): number;
|
|
8
|
+
private fetchData;
|
|
9
|
+
load(countryCode: string): Promise<any>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = '0';
|
|
4
|
+
export class EurostatAPI {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.countries = [];
|
|
7
|
+
this.fuels = {
|
|
8
|
+
gas: { chartType: 'NRG_CB_GASM', siec: 'G3000', nrg_bal: 'IC_OBS', unit: 'TJ_GCV', freq: 'M' },
|
|
9
|
+
gas4electricity: { chartType: 'NRG_CB_GASM', siec: 'G3000', nrg_bal: 'TI_EHG_MAP', unit: 'TJ_GCV', freq: 'M' },
|
|
10
|
+
gasoline: { chartType: 'NRG_CB_OILM', siec: 'O4652', nrg_bal: 'GID_OBS', unit: 'THS_T', freq: 'M' },
|
|
11
|
+
diesel: { chartType: 'NRG_CB_OILM', siec: 'O46711', nrg_bal: 'GID_OBS', unit: 'THS_T', freq: 'M' },
|
|
12
|
+
kerosin: { chartType: 'NRG_CB_OILM', siec: 'O4661', nrg_bal: 'GID_OBS', unit: 'THS_T', freq: 'M' }
|
|
13
|
+
};
|
|
14
|
+
this.energyConversionFactors = new Map([
|
|
15
|
+
['KG_EQ', 12988.48],
|
|
16
|
+
['TJ_GCV', 10 ** 12],
|
|
17
|
+
['THS_T', 41868000000000], // joules per thousand metric tons of oil equivalent
|
|
18
|
+
]);
|
|
19
|
+
const countryPath = join(__dirname, '..', 'config/countries.json');
|
|
20
|
+
const countriesString = readFileSync(countryPath, 'utf-8');
|
|
21
|
+
this.countries = JSON.parse(countriesString);
|
|
22
|
+
}
|
|
23
|
+
convertToMWh(value, unit) {
|
|
24
|
+
const MWh = value * (this.energyConversionFactors.get(unit) || 0) / 3600 / 10 ** 6;
|
|
25
|
+
return Math.round(MWh);
|
|
26
|
+
}
|
|
27
|
+
async fetchData(url, type, unit) {
|
|
28
|
+
const response = await fetch(url);
|
|
29
|
+
const data = await response.json();
|
|
30
|
+
try {
|
|
31
|
+
const time = Object.keys(data.dimension.time.category.index);
|
|
32
|
+
return {
|
|
33
|
+
time: time.map(item => new Date(item).getTime()),
|
|
34
|
+
[type]: Object.values(data.value).map((item) => this.convertToMWh(item, unit))
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
return {
|
|
39
|
+
[type]: [],
|
|
40
|
+
time: []
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async load(countryCode) {
|
|
45
|
+
var _a;
|
|
46
|
+
const countryShort = (_a = this.countries.find(item => item.code === countryCode)) === null || _a === void 0 ? void 0 : _a.short;
|
|
47
|
+
const baseUrl = 'https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/';
|
|
48
|
+
const geo = `.${countryShort}`;
|
|
49
|
+
const promises = [];
|
|
50
|
+
for (const [type, fuel] of Object.entries(this.fuels)) {
|
|
51
|
+
const { chartType, siec, nrg_bal, unit, freq } = fuel;
|
|
52
|
+
const select = `${chartType}/${freq}.${nrg_bal}.${siec}.${unit}`;
|
|
53
|
+
const rest = `?format=JSON&lang=en&startPeriod=2015-01&endPeriod=2050-12`;
|
|
54
|
+
const url = `${baseUrl}${select}${geo}${rest}`;
|
|
55
|
+
promises.push(this.fetchData(url, type, unit));
|
|
56
|
+
}
|
|
57
|
+
const res = await Promise.all(promises);
|
|
58
|
+
let merged = {};
|
|
59
|
+
res.forEach(item => {
|
|
60
|
+
merged = { ...merged, ...item };
|
|
61
|
+
});
|
|
62
|
+
return merged; // this.removeElGas(merged);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=Eurostat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Eurostat.js","sourceRoot":"","sources":["../../src/router/services/Eurostat.ts"],"names":[],"mappings":"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"}
|