diff --git a/index.js b/index.js index 1e2048ae66576b8420545667c3b2416a82c4d1b6..44b9bc6e6209568ac3de8b190f802bcbe17c1f1e 100644 --- a/index.js +++ b/index.js @@ -109,18 +109,23 @@ moment.tz.setDefault('Europe/Paris') // set the timezone /*** Connector Constants ***/ const manualExecution = process.env.COZY_JOB_MANUAL_EXECUTION === 'true' ? true : false +// Period for daily data const startDailyDate = manualExecution ? moment().subtract(12, 'month') : moment().subtract(32, 'month') const startDailyDateString = startDailyDate.format('YYYY-MM-DD') +// Period for half and hour data const startLoadDate = moment().subtract(7, 'day') const startLoadDateString = startLoadDate.format('YYYY-MM-DD') +// Period to define if the history is loaded const checkHistoryDate = moment().subtract(8, 'day') const endDate = moment() const endDateString = endDate.format('YYYY-MM-DD') +// Endpoints config const baseUrl = 'https://gw.prd.api.enedis.fr' const dailyDataURL = `${baseUrl}/v4/metering_data/daily_consumption` const loadCurveURL = `${baseUrl}/v4/metering_data/consumption_load_curve` +const maxPowerURL = `${baseUrl}/v4/metering_data/daily_consumption_max_power` /** * The start function is run by the BaseKonnector instance only when it got all the account @@ -170,10 +175,20 @@ async function start(fields, cozyParameters, doRetry = true) { await agregateMonthAndYearData(processedDailyData) log('info', 'Process enedis load data') await startLoadDataProcess(access_token, usage_point_id) + + log('info', 'Fetching enedis max Power data') + const fetchedMaxPowerData = await getMaxPower(access_token, usage_point_id) + log('info', 'Process enedis maxPower data') + + await processData(fetchedMaxPowerData, 'com.grandlyon.enedis.maxpower', [ + 'year', + 'month', + 'day', + ]) } catch (err) { if (err.statusCode === 403 || err.code === 403) { if (!fields.refresh_token) { - log('info', 'no refresh token found') + log('debug', 'no refresh token found') throw errors.USER_ACTION_NEEDED_OAUTH_OUTDATED } else if (doRetry) { log('info', 'asking refresh from the stack') @@ -184,7 +199,7 @@ async function start(fields, cozyParameters, doRetry = true) { `/accounts/enedisgrandlyon/${accountId}/refresh` ) } catch (err) { - log('info', `Error during refresh ${err.message}`) + log('debug', `Error during refresh ${err.message}`) throw errors.USER_ACTION_NEEDED_OAUTH_OUTDATED } log('info', 'refresh response') @@ -193,8 +208,15 @@ async function start(fields, cozyParameters, doRetry = true) { fields.usage_point_id = usage_point_id return start(fields, cozyParameters, false) } + if (err.message.search('ADAM-DC-0008') > 0) { + log( + 'debug', + 'No consent can be found for this customer and this usage point' + ) + throw errors.USER_ACTION_NEEDED_OAUTH_OUTDATED + } log('error', `Error during authentication: ${err.message}`) - throw errors.VENDOR_DOWN + throw errors.LOGIN_FAILED } else { log('error', 'caught an unexpected error') log('error', err.message) @@ -227,6 +249,30 @@ async function getDailyData(token, usagePointID) { return response } +/** + * Retrieve data from the max Power endpoint + * Format: { value: "VA", "date": "YYYY-MM-DD" } + */ +async function getMaxPower(token, usagePointID) { + const dataRequest = { + method: 'GET', + uri: + maxPowerURL + + '?start=' + + startDailyDateString + + '&end=' + + endDateString + + '&usage_point_id=' + + usagePointID, + headers: { + Accept: 'application/json', + Authorization: 'Bearer ' + token, + }, + } + const response = await rp(dataRequest) + return response +} + /** * Check if history is loaded * If not, call several time the api to retrieve 1 month of history for load data @@ -313,6 +359,12 @@ async function checkConsentForLoadCurve( } else if (err.statusCode === 403 || err.code === 403) { log('info', 'No consent for load curve') return false + } else if ( + (err.statusCode === 404 || err.code === 404) && + err.message.search('no_data_found') > 0 + ) { + log('info', 'Handling half-hour error on connection') + return false } else { throw err } @@ -408,13 +460,9 @@ async function processData(data, doctype, filterKeys) { const parsedData = JSON.parse(data) const intervalData = parsedData.meter_reading.interval_reading const formatedData = await formateData(intervalData, doctype) - // Remove data for existing days into the DB - const filteredData = await hydrateAndFilter(formatedData, doctype, { - keys: filterKeys, - }) // Store new day data - await storeData(filteredData, doctype, filterKeys) - return filteredData + const storedData = await storeData(formatedData, doctype, filterKeys) + return storedData } /** @@ -123900,7 +123948,7 @@ const fs = __webpack_require__(167); const path = __webpack_require__(160); -let manifest = typeof {"version":"1.0.1","name":"Enedis","type":"konnector","language":"node","icon":"icon.png","slug":"enedisgrandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-konnector.git","editor":"Métropole de Lyon","vendor_link":"https://www.enedis.fr/","categories":["energy"],"frequency":"daily","fields":{"access_token":{"type":"hidden"},"refresh_token":{"type":"hidden"}},"oauth":{},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"} === 'undefined' ? {} : {"version":"1.0.1","name":"Enedis","type":"konnector","language":"node","icon":"icon.png","slug":"enedisgrandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-konnector.git","editor":"Métropole de Lyon","vendor_link":"https://www.enedis.fr/","categories":["energy"],"frequency":"daily","fields":{"access_token":{"type":"hidden"},"refresh_token":{"type":"hidden"}},"oauth":{},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"}; +let manifest = typeof {"version":"1.1.2","name":"Enedis","type":"konnector","language":"node","icon":"icon.png","slug":"enedisgrandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-konnector.git","editor":"Métropole de Lyon","vendor_link":"https://www.enedis.fr/","categories":["energy"],"frequency":"daily","fields":{"access_token":{"type":"hidden"},"refresh_token":{"type":"hidden"}},"oauth":{},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"} === 'undefined' ? {} : {"version":"1.1.2","name":"Enedis","type":"konnector","language":"node","icon":"icon.png","slug":"enedisgrandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-konnector.git","editor":"Métropole de Lyon","vendor_link":"https://www.enedis.fr/","categories":["energy"],"frequency":"daily","fields":{"access_token":{"type":"hidden"},"refresh_token":{"type":"hidden"}},"oauth":{},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"}; if (false) {} diff --git a/manifest.konnector b/manifest.konnector index 31179417b41c6ca3730b0dc9ddfcbcf5170a304e..aabe9245a27a2a6e7834fe6f605e1f1f2e550e8f 100644 --- a/manifest.konnector +++ b/manifest.konnector @@ -1,5 +1,5 @@ { - "version": "1.0.1", + "version": "1.1.2", "name": "Enedis", "type": "konnector", "language": "node", diff --git a/package.json b/package.json index e1a712b7aa254ea4a65b8350e1688613a548a59c..3c74184f67e4c01e7f9441a4c3e78abc2d36df77 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "enedis", - "version": "1.0.1", + "version": "1.1.2", "description": "", "repository": { "type": "git",