Newer
Older
import { FluidType } from 'enums'
import fs from 'fs'
import { DateTime } from 'luxon'
import { DataloadEntity } from 'models'
import config from './config'
const fluidConfig = require('../src/constants/config.json').fluidConfig
/*
* Create dummy data files for each fluid.
* Hourly data is not generated
*/
type IMockData = Omit<DataloadEntity, 'id'>
/** Generate a random float between min and max */
function getRandomNumber(min: number, max: number) {
let randomFloat = Math.random() * (max - min) + min
// Round to two decimal places
randomFloat = Math.round(randomFloat * 100) / 100
return randomFloat
const generateHalfAnHourData = (
startingDate: DateTime,
endingDate: DateTime,
min: number,
max: number
) => {
let parsingDate = DateTime.local(
startingDate.year,
startingDate.month,
startingDate.day,

Rémi PAILHAREY
committed
0,
0
)
const halfAnHourDumpArray: IMockData[] = []
while (parsingDate <= endingDate) {
const load = getRandomNumber(min, max)
halfAnHourDumpArray.push({
load: load,
year: parsingDate.year,
month: parsingDate.month,
day: parsingDate.day,
hour: parsingDate.hour,
minute: parsingDate.minute,
})
parsingDate = parsingDate.plus({ minute: 30 })
}
const generateData = (
startingDate: DateTime,
endingDate: DateTime,
min: number,
max: number,
fluidType: FluidType
) => {
startingDate.year,
startingDate.month,
startingDate.day
const dayDumpArray: IMockData[] = []
while (parsingDate <= endingDate) {
const load = getRandomNumber(min, max)
dayDumpArray.push({
load: load,
year: parsingDate.year,
month: parsingDate.month,
day: parsingDate.day,
hour: 0,
minute: 0,
price: load * fluidConfig[fluidType].coefficient,
})
parsingDate = parsingDate.plus({ days: 1 })
}
/** Function to aggregate load data for a specific period */
function aggregateLoadData(data: IMockData[], period: string) {
const aggregatedData: Record<string, IMockData> = {}
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const entryCopy = { ...entry }
switch (period) {
case 'day':
key = `${entryCopy.year}-${entryCopy.month}-${entryCopy.day}`
entryCopy.hour = 0
entryCopy.minute = 0
break
case 'month':
key = `${entryCopy.year}-${entryCopy.month}`
entryCopy.day = 0
entryCopy.minute = 0
break
case 'year':
key = `${entryCopy.year}`
entryCopy.month = 0
entryCopy.day = 0
entryCopy.minute = 0
break
default:
break
}
if (!aggregatedData[key]) {
aggregatedData[key] = {
load: entryCopy.load,
year: entryCopy.year,
month: entryCopy.month,
day: entryCopy.day,
hour: entryCopy.hour,
minute: entryCopy.minute,
}
} else {
aggregatedData[key].load += entryCopy.load
if (aggregatedData[key].price !== undefined) {
aggregatedData[key].price = 0
}
return Object.values(aggregatedData)
// Create data folder
const dir = './data'
if (!fs.existsSync(dir)) {
console.log('Create data folder...')
fs.mkdirSync(dir)
}
const startingDate = config.startingDate
const halfHourStartingDate = config.halfHourStartingDate
const elecHalfHourData = generateHalfAnHourData(
halfHourStartingDate,

Rémi PAILHAREY
committed
0.12,
0.36
// Aggregate all half-hour data available and generate more daily data between startingDate and halfHourStartingDate
const elecAggregatedDayData = aggregateLoadData(elecHalfHourData, 'day')
const elecGeneratedDayData = generateData(
startingDate,
halfHourStartingDate.minus({ days: 1 }),
4,
)
const elecDayData = [...elecAggregatedDayData, ...elecGeneratedDayData]
const elecMonthData = aggregateLoadData(elecDayData, 'month')
const elecYearData = aggregateLoadData(elecMonthData, 'year')
const gasDayData = generateData(startingDate, endingDate, 16, 68, 2)
const gasMonthData = aggregateLoadData(gasDayData, 'month')
const gasYearData = aggregateLoadData(gasMonthData, 'year')
const waterDayData = generateData(startingDate, endingDate, 200, 300, 1)
const waterMonthData = aggregateLoadData(waterDayData, 'month')
const waterYearData = aggregateLoadData(waterMonthData, 'year')
'com.grandlyon.enedis.minute': elecHalfHourData,
'com.grandlyon.enedis.day': elecDayData,
'com.grandlyon.enedis.month': elecMonthData,
'com.grandlyon.enedis.year': elecYearData,
'com.grandlyon.grdf.day': gasDayData,
'com.grandlyon.grdf.month': gasMonthData,
'com.grandlyon.grdf.year': gasYearData,
'com.grandlyon.egl.day': waterDayData,
'com.grandlyon.egl.month': waterMonthData,
'com.grandlyon.egl.year': waterYearData,
}
const dumpString = JSON.stringify(dump)
fs.writeFile('data/loads.json', dumpString, function (err: unknown) {