diff --git a/2/ecolyo.53b3b5017b9ca24efe17.js b/2/ecolyo.94fc41cee89ed06a1ba5.js
similarity index 99%
rename from 2/ecolyo.53b3b5017b9ca24efe17.js
rename to 2/ecolyo.94fc41cee89ed06a1ba5.js
index e81850c471fad9f047812390cfd7216676453efc..ee0d4b16a8e8b68ea73ac22c256b9ebec5fb69e8 100644
--- a/2/ecolyo.53b3b5017b9ca24efe17.js
+++ b/2/ecolyo.94fc41cee89ed06a1ba5.js
@@ -472,8 +472,7 @@ var PieChart = function PieChart(_ref) {
     var data = createPie(dataloadArray);
     var group = d3.select(ref.current);
     var groupWithData = group.selectAll('g.arc').data(data);
-    var colors = ['#D87B39', '#3A98EC', '#45D1B8']; // eslint-disable-next-line @typescript-eslint/no-explicit-any
-
+    var colors = ['#D87B39', '#3A98EC', '#45D1B8'];
     var createArc = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius);
     groupWithData.exit().remove();
     var groupWithUpdate = groupWithData.enter().append('g').attr('class', 'arc').attr('filter', 'url(#glow)');
@@ -2658,9 +2657,9 @@ var ElecHalfHourChart = function ElecHalfHourChart(_ref) {
 
   var chartContainer = (0, _react.useRef)(null);
   var marginLeft = 10;
-  var marginRight = 10;
-  var marginTop = 20;
-  var marginBottom = 50;
+  var marginRight = 50;
+  var marginTop = 0;
+  var marginBottom = 30;
 
   var getContentWidth = function getContentWidth() {
     return width - marginLeft - marginRight;
@@ -2679,8 +2678,9 @@ var ElecHalfHourChart = function ElecHalfHourChart(_ref) {
 
   var xScale = (0, _d3Scale.scaleBand)().domain(dataLoad.map(function (d) {
     return d.date.toLocaleString(_luxon.DateTime.DATETIME_SHORT);
-  })).range([0, getContentWidth()]).padding(0.2);
+  })).range([0, getContentWidth()]).padding(0.4);
   var yScale = (0, _d3Scale.scaleLinear)().domain([0, getMaxLoad()]).range([getContentHeight(), 0]);
+  console.log('dataload', dataLoad);
   (0, _react.useEffect)(function () {
     function handleResize() {
       var maxWidth = 940;
@@ -2711,11 +2711,10 @@ var ElecHalfHourChart = function ElecHalfHourChart(_ref) {
     fluidType: _fluid.FluidType.ELECTRICITY,
     yScale: yScale,
     width: width,
-    marginRight: marginRight,
-    marginTop: marginTop,
-    isAnalysis: true
+    marginRight: marginRight + 0,
+    marginTop: marginTop
   }), /*#__PURE__*/_react.default.createElement("g", {
-    transform: "translate(".concat(10, ",", 10, ")")
+    transform: "translate(".concat(10, ",", 0, ")")
   }, dataLoad.map(function (value, index) {
     return /*#__PURE__*/_react.default.createElement(_Bar.default, {
       key: index,
diff --git a/3/ecolyo.a29511c9935a11e987b6.js b/3/ecolyo.f9819317aec60f8d1b6f.js
similarity index 99%
rename from 3/ecolyo.a29511c9935a11e987b6.js
rename to 3/ecolyo.f9819317aec60f8d1b6f.js
index b64450387f090fd00dd2e732bcc83a931754acdb..67701cd92488c26f66e2dfe744e03e3b8de23555 100644
--- a/3/ecolyo.a29511c9935a11e987b6.js
+++ b/3/ecolyo.f9819317aec60f8d1b6f.js
@@ -1454,8 +1454,6 @@ var ConsumptionView = function ConsumptionView(_ref) {
       _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
       consentExpiredFluids = _useState12[0],
       setconsentExpiredFluids = _useState12[1];
-  /* eslint-disable @typescript-eslint/no-non-null-assertion */
-
 
   var updatekey = fluidType !== _fluid.FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate ? "".concat(fluidStatus[fluidType].lastDataDate.toLocaleString(), " + ").concat(fluidStatus[fluidType].status + fluidType) : '';
   var lastDataDateKey = fluidType !== _fluid.FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate ? "".concat(fluidStatus[fluidType].lastDataDate.toLocaleString() + fluidType) : '';
diff --git a/app/ecolyo.661ca74a9860cde92f98.js b/app/ecolyo.3c2e62dde4e0b2837300.js
similarity index 99%
rename from app/ecolyo.661ca74a9860cde92f98.js
rename to app/ecolyo.3c2e62dde4e0b2837300.js
index 75ee69448c9460efdb36a228b992ebf4666e5412..abfa3ac0ed9bcb43a5a2b546140a58a00179e095 100644
--- a/app/ecolyo.661ca74a9860cde92f98.js
+++ b/app/ecolyo.3c2e62dde4e0b2837300.js
@@ -64,7 +64,7 @@
 /******/
 /******/ 	// script path function
 /******/ 	function jsonpScriptSrc(chunkId) {
-/******/ 		return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"2":"53b3b5017b9ca24efe17","3":"a29511c9935a11e987b6","4":"5e481431cf0b2359d58d","5":"be40de25a698f7337c41","6":"cf316224f80d91ba8e19","7":"8e0088481e1baf094fa4","8":"bcd9da9f5a58c3f60050","9":"b67676e3ba222d0c6efa","10":"1823bf23fa5cf052fd8e"}[chunkId] + ".js"
+/******/ 		return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"2":"94fc41cee89ed06a1ba5","3":"f9819317aec60f8d1b6f","4":"5e481431cf0b2359d58d","5":"be40de25a698f7337c41","6":"cf316224f80d91ba8e19","7":"8e0088481e1baf094fa4","8":"bcd9da9f5a58c3f60050","9":"b67676e3ba222d0c6efa","10":"1823bf23fa5cf052fd8e"}[chunkId] + ".js"
 /******/ 	}
 /******/
 /******/ 	// The require function
@@ -662,8 +662,6 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
 /* eslint-disable @typescript-eslint/no-explicit-any */
 
 /* eslint-disable @typescript-eslint/no-var-requires */
-
-/* global cozy */
 var setupApp = (0, _lodash.memoize)(function () {
   var history = (0, _history.createBrowserHistory)(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
 
@@ -2116,8 +2114,7 @@ var AxisRight = function AxisRight(_ref) {
       fluidType = _ref.fluidType,
       width = _ref.width,
       marginRight = _ref.marginRight,
-      marginTop = _ref.marginTop,
-      isAnalysis = _ref.isAnalysis;
+      marginTop = _ref.marginTop;
 
   var _useI18n = (0, _I18n.useI18n)(),
       t = _useI18n.t;
@@ -2128,7 +2125,7 @@ var AxisRight = function AxisRight(_ref) {
 
   var drawYAxis = function drawYAxis() {
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    (0, _d3Selection.select)(yAxisRef.current).call((0, _d3Axis.axisRight)(yScale).ticks(isAnalysis ? 0 : 4).tickSize(-width).tickSizeOuter(0).tickFormat(function (d) {
+    (0, _d3Selection.select)(yAxisRef.current).call((0, _d3Axis.axisRight)(yScale).ticks(4).tickSize(-width).tickSizeOuter(0).tickFormat(function (d) {
       return d >= 1000 && fluidStyle !== 'MULTIFLUID' ? typeof d === 'number' ? "".concat(d / 1000, " ").concat(t('FLUID.' + fluidStyle + '.MEGAUNIT')) : "".concat(d.valueOf() / 1000, " ").concat(t('FLUID.' + fluidStyle + '.MEGAUNIT')) : d === 0 ? "".concat(d) : "".concat(d, " ").concat(t('FLUID.' + fluidStyle + '.UNIT'));
     }));
     (0, _d3Selection.selectAll)('.tick text').attr('class', 'chart-ticks-y-text');
@@ -3235,6 +3232,7 @@ var _classCallCheck2 = _interopRequireDefault(__webpack_require__("lwsE"));
 
 var _createClass2 = _interopRequireDefault(__webpack_require__("W8MJ"));
 
+/* eslint-disable @typescript-eslint/no-explicit-any */
 var MailService = /*#__PURE__*/function () {
   function MailService() {
     (0, _classCallCheck2.default)(this, MailService);
@@ -3554,7 +3552,7 @@ var ActionOnGoing = function ActionOnGoing(_ref) {
       var progressionInDays = -Math.round(userAction.startDate.diffNow('days').days);
       var progress = ratio * progressionInDays;
 
-      if (progress === 0 || progress === -0) {
+      if (progress === 0) {
         return "linear-gradient(90deg, #121212 50%,transparent 50%), linear-gradient(110deg, #58ffff 50%, transparent 50%)";
       } else if (progress === circle) {
         return "linear-gradient(90deg, #58ffff 50%, #58ffff 50%)";
@@ -3590,7 +3588,7 @@ var ActionOnGoing = function ActionOnGoing(_ref) {
   }, userAction.ecogesture && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
     className: "duration text-18-normal"
   }, t('action.duration', {
-    // eslint-disable-next-line @typescript-eslint/camelcase
+    // eslint-disable-next-line camelcase
     smart_count: userAction.ecogesture.actionDuration
   })), /*#__PURE__*/_react.default.createElement("div", {
     className: "description text-18-bold"
@@ -4387,7 +4385,8 @@ var ActionBegin = function ActionBegin(_ref) {
   }, currentAction.shortName), /*#__PURE__*/_react.default.createElement("div", {
     className: "action-duration text-18"
   }, t('action.duration', {
-    // eslint-disable-next-line @typescript-eslint/camelcase
+    // eslint-disable-next-line camelcase
+    // eslint-disable-next-line camelcase
     smart_count: currentAction.actionDuration
   })), /*#__PURE__*/_react.default.createElement("div", {
     className: "action-text text-18-bold"
@@ -5219,9 +5218,11 @@ var DuelOngoing = function DuelOngoing(_ref) {
     className: "duel-goal text-18-normal"
   }, t('duel.goal1', {
     durationInDays: durationInDays,
+    // eslint-disable-next-line camelcase
     smart_count: durationInDays
   }), /*#__PURE__*/_react.default.createElement("span", null, " "), t('duel.goal2', {
     title: title,
+    // eslint-disable-next-line camelcase
     smart_count: title
   })), /*#__PURE__*/_react.default.createElement("div", {
     className: "duel-consumption text-28-normal"
@@ -5889,7 +5890,7 @@ var migrations = [{
   isCreate: true,
   isDeprecated: true,
   run: function () {
-    var _run9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(_client, docs) {
+    var _run9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9() {
       return _regenerator.default.wrap(function _callee9$(_context9) {
         while (1) {
           switch (_context9.prev = _context9.next) {
@@ -5904,7 +5905,7 @@ var migrations = [{
       }, _callee9);
     }));
 
-    function run(_x17, _x18) {
+    function run() {
       return _run9.apply(this, arguments);
     }
 
@@ -5938,7 +5939,7 @@ var migrations = [{
       }, _callee10);
     }));
 
-    function run(_x19, _x20) {
+    function run(_x17, _x18) {
       return _run10.apply(this, arguments);
     }
 
@@ -5978,7 +5979,7 @@ var migrations = [{
       }, _callee11);
     }));
 
-    function run(_x21, _x22) {
+    function run(_x19, _x20) {
       return _run11.apply(this, arguments);
     }
 
@@ -6033,7 +6034,7 @@ var migrations = [{
       }, _callee12);
     }));
 
-    function run(_x23, _x24) {
+    function run(_x21, _x22) {
       return _run12.apply(this, arguments);
     }
 
@@ -6088,7 +6089,7 @@ var migrations = [{
       }, _callee13);
     }));
 
-    function run(_x25, _x26) {
+    function run(_x23, _x24) {
       return _run13.apply(this, arguments);
     }
 
@@ -6128,7 +6129,7 @@ var migrations = [{
       }, _callee14);
     }));
 
-    function run(_x27, _x28) {
+    function run(_x25, _x26) {
       return _run14.apply(this, arguments);
     }
 
@@ -6168,7 +6169,7 @@ var migrations = [{
       }, _callee15);
     }));
 
-    function run(_x29, _x30) {
+    function run(_x27, _x28) {
       return _run15.apply(this, arguments);
     }
 
@@ -6208,7 +6209,7 @@ var migrations = [{
       }, _callee16);
     }));
 
-    function run(_x31, _x32) {
+    function run(_x29, _x30) {
       return _run16.apply(this, arguments);
     }
 
@@ -6248,7 +6249,7 @@ var migrations = [{
       }, _callee17);
     }));
 
-    function run(_x33, _x34) {
+    function run(_x31, _x32) {
       return _run17.apply(this, arguments);
     }
 
@@ -6263,7 +6264,7 @@ var migrations = [{
   docTypes: _doctypes.FLUIDPRICES_DOCTYPE,
   isDeprecated: true,
   run: function () {
-    var _run18 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee18(_client, docs) {
+    var _run18 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee18() {
       return _regenerator.default.wrap(function _callee18$(_context18) {
         while (1) {
           switch (_context18.prev = _context18.next) {
@@ -6278,7 +6279,7 @@ var migrations = [{
       }, _callee18);
     }));
 
-    function run(_x35, _x36) {
+    function run() {
       return _run18.apply(this, arguments);
     }
 
@@ -6319,7 +6320,7 @@ var migrations = [{
       }, _callee19);
     }));
 
-    function run(_x37, _x38) {
+    function run(_x33, _x34) {
       return _run19.apply(this, arguments);
     }
 
@@ -6351,7 +6352,7 @@ var migrations = [{
       }, _callee20);
     }));
 
-    function run(_x39, _x40) {
+    function run(_x35, _x36) {
       return _run20.apply(this, arguments);
     }
 
@@ -17962,7 +17963,7 @@ var DuelUnlocked = function DuelUnlocked(_ref) {
     className: "duel-average-info text-18-normal"
   }, "".concat(t('duel.average_info', {
     average: average,
-    // eslint-disable-next-line @typescript-eslint/camelcase
+    // eslint-disable-next-line camelcase
     smart_count: average
   }))), /*#__PURE__*/_react.default.createElement("div", {
     className: "button-start"
@@ -26005,7 +26006,8 @@ exports.default = void 0;
 
 var _minilog = _interopRequireDefault(__webpack_require__("btPC"));
 
-var inBrowser = typeof window !== 'undefined';
+var inBrowser = typeof window !== 'undefined'; // eslint-disable-next-line no-undef
+
 var minilog = inBrowser && window.minilog || _minilog.default;
 var log = minilog('ecolyo');
 var _default = log;
@@ -29488,7 +29490,7 @@ var EcogestureSelectionRestart = function EcogestureSelectionRestart(_ref) {
   }, /*#__PURE__*/_react.default.createElement("div", {
     className: "title text-21-bold"
   }, t('ecogesture_selection.title', {
-    // eslint-disable-next-line @typescript-eslint/camelcase
+    // eslint-disable-next-line camelcase
     smart_count: listLength
   })), /*#__PURE__*/_react.default.createElement(_StyledIcon.default, {
     icon: _ECOGESTURE.default,
@@ -31360,7 +31362,7 @@ exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React compo
 /***/ "pZg0":
 /***/ (function(module, exports) {
 
-module.exports = {"name":"Ecolyo","slug":"ecolyo","icon":"icon.svg","categories":["energy"],"version":"1.10.2","licence":"AGPL-3.0","editor":"Métropole de Lyon","default_locale":"fr","locales":{"fr":{"short_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer.","long_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer afin de vous accompagner dans la gestion quotidienne de ces consommations et ce, de façon ludique en vous lançant des défis personnalisés.","permissions":{"ecolyo":{"description":"Requises pour le fonctionnement des différentes parties de l’application (Analyse, liste d’écogestes personnalisée, …)."},"enedis":{"description":"Requises pour l’affichage et l’analyse de vos consommations électriques dans Ecolyo. Issues du connecteur Enedis."},"grdf":{"description":"Requises pour l’affichage et l’analyse de vos consommations de gaz dans Ecolyo. Issues du connecteur GRDF."},"egl":{"description":"Requises pour l’affichage et l’analyse de vos consommations d’eau dans Ecolyo. Issues du connecteur Eau du Grand Lyon."},"konnectors":{"description":"Requis pour vérifier la présence des connecteurs Enedis, GRDF et Eau du Grand Lyon ainsi que pour pouvoir les configurer à partir de l’application Ecolyo."},"accounts":{"description":"Requis pour stocker des informations propres aux comptes énergie et eau (Enedis, GRDF, Eau du Grand Lyon). Sont stockés votre numéro de PDL pour Enedis, votre numéro de PCE pour GRDF, vos logins et mots de passe pour Eau du Grand Lyon."},"triggers":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"jobs":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"terms":{"description":"Nécessaire pour la gestion des consentements de l'application"},"apps":{"description":"Requis par Cozy pour afficher les icônes des applications installées dans la barre Cozy."},"settings":{"description":"Requis pour afficher les paramètres Cozy dans la barre Cozy."},"ecolyo-dju":{"description":"Requis pour la récupération des DJU (Degrés Jours Unifiés), informations météorologiques permettant d’ajuster le modèle de comparaison des consommations énergétiques."},"dacc-dev":{"description":"Requis pour la récupération et l’envoi de statistiques d’utilisation anonymisées dans un environnement de test."},"dacc":{"description":"Requis pour envoyer des statistiques d'utilisation anonymisées."},"backoffice-rec":{"description":"Requis pour la récupération des données de la newsletter dans un environment de test."},"backoffice":{"description":"Requis pour la récupération des données de la newsletter."},"backoffice-partners-info-rec":{"description":"Requis pour la récupération du status des services partenaires dans un environment de test."},"backoffice-partners-info":{"description":"Requis pour la récupération du status des services partenaires"},"backoffice-prices-rec":{"description":"Requis pour la récupération du prix des fluides dans un environnement de test."},"backoffice-prices":{"description":"Requis pour la récupération du prix des fluides."}}},"en":{"short_description":"Ecolyo a free service developed by Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home.","long_description":"Ecolyo a free service developed by the Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home. To help you in reducing your daily consumption it gives you best energy consumption practices, consumption analysis and challenges to take up. At least one Smartmeter is needed among Linky (for electricity), Gazpar (for gas) or Téléo (for water).","permissions":{"ecolyo":{"description":"Required for the operation of the different parts of the application (Analysis, customized eco-gesture lists, etc...)."},"enedis":{"description":"Required for the display and analysis of your electricity consumption in Ecolyo. Retrieved by the Enedis connector."},"grdf":{"description":"Required for the display and analysis of your gas consumption in Ecolyo. Retrieved by the GRDF connector."},"egl":{"description":"Required for the display and analysis of your water consumption in Ecolyo. Retrieved by the Eau du Grand Lyon connector."},"konnectors":{"description":"Required to verify the presence of the Enedis, GRDF and Eau du Grand Lyon connectors as well as to be able to configure them from the Ecolyo application."},"accounts":{"description":"Required to store information specific to energy and water accounts (Enedis, GRDF, Eau du Grand Lyon). Your PDL number for Enedis, your PCE number for GRDF, your logins and passwords for Eau du Grand Lyon are stored."},"triggers":{"description":"Required for the correct functioning of the energy and water connectors."},"jobs":{"description":"Required for the correct functioning of the energy and water connectors."},"terms":{"description":"Required for the correct managment of CGU."},"apps":{"description":"Required to display the icons of installed applications in the Cozy bar."},"settings":{"description":"Required for the application's consents managment"},"ecolyo-dju":{"description":"Required to gather udd data (Unified Degree Days), a meteorological data allowing the app to adjust our energical consumption model. "},"dacc-dev":{"description":"Required for gathering and sending anonymous usage statistics for test environment."},"dacc":{"description":"Required for sending cozy anonymized stats."},"backoffice-rec":{"description":"Required for retrieving newsletter informations from backoffice rec."},"backoffice":{"description":"Required for retrieving newsletter informations from backoffice prod."},"backoffice-partners-info-rec":{"description":"Required for getting the status of partners' services in test environment."},"backoffice-partners-info":{"description":"Required for getting the status of partners' services"},"backoffice-prices-rec":{"description":"Required for getting fluid prices form backoffice rec."},"backoffice-prices":{"description":"Required for getting fluid prices form backoffice prod"}}}},"langs":["fr"],"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"routes":{"/":{"folder":"/","index":"index.html","public":false}},"services":{"enedisHalfHourMonthlyAnalysis":{"type":"node","file":"services/enedisHalfHourMonthlyAnalysis/ecolyo.js","trigger":"@cron 0 0 8 3 * *"},"monthlyReportNotification":{"type":"node","file":"services/monthlyReportNotification/ecolyo.js","trigger":"@cron 0 0 10 3 * *"},"consumptionAlert":{"type":"node","file":"services/consumptionAlert/ecolyo.js","trigger":"@cron 0 3 * * *"},"aggregatorUsageEvents":{"type":"node","file":"services/aggregatorUsageEvents/ecolyo.js","trigger":"@cron 0 1 * * *"},"fluidsPrices":{"type":"node","file":"services/fluidsPrices/ecolyo.js","trigger":"@cron 0 2 * * *"}},"permissions":{"ecolyo":{"type":"com.grandlyon.ecolyo.*"},"enedis":{"type":"com.grandlyon.enedis.*"},"grdf":{"type":"com.grandlyon.grdf.*"},"egl":{"type":"com.grandlyon.egl.*"},"konnectors":{"type":"io.cozy.konnectors"},"accounts":{"type":"io.cozy.accounts"},"triggers":{"type":"io.cozy.triggers"},"jobs":{"type":"io.cozy.jobs"},"terms":{"type":"io.cozy.terms"},"apps":{"type":"io.cozy.apps","verbs":["GET"]},"settings":{"type":"io.cozy.settings","verbs":["GET"]},"ecolyo-dju":{"type":"org.ecolyo.dju","verbs":["GET"]},"dacc":{"type":"cc.cozycloud.dacc_v2","verbs":["ALL"]},"dacc-dev":{"type":"cc.cozycloud.dacc.dev_v2","verbs":["ALL"]},"backoffice-rec":{"type":"org.ecolyo.backoffice.rec","verbs":["ALL"]},"backoffice-prod":{"type":"org.ecolyo.backoffice","verbs":["ALL"]},"backoffice-partners-info-rec":{"type":"org.ecolyo.backoffice.partners.info.rec","verbs":["ALL"]},"backoffice-partners-info":{"type":"org.ecolyo.backoffice.partners.info","verbs":["ALL"]},"backoffice-prices-rec":{"type":"org.ecolyo.backoffice.prices.rec","verbs":["ALL"]},"backoffice-prices":{"type":"org.ecolyo.backoffice.prices","verbs":["ALL"]}}}
+module.exports = {"name":"Ecolyo","slug":"ecolyo","icon":"icon.svg","categories":["energy"],"version":"1.11.0","licence":"AGPL-3.0","editor":"Métropole de Lyon","default_locale":"fr","locales":{"fr":{"short_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer.","long_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer afin de vous accompagner dans la gestion quotidienne de ces consommations et ce, de façon ludique en vous lançant des défis personnalisés.","permissions":{"ecolyo":{"description":"Requises pour le fonctionnement des différentes parties de l’application (Analyse, liste d’écogestes personnalisée, …)."},"enedis":{"description":"Requises pour l’affichage et l’analyse de vos consommations électriques dans Ecolyo. Issues du connecteur Enedis."},"grdf":{"description":"Requises pour l’affichage et l’analyse de vos consommations de gaz dans Ecolyo. Issues du connecteur GRDF."},"egl":{"description":"Requises pour l’affichage et l’analyse de vos consommations d’eau dans Ecolyo. Issues du connecteur Eau du Grand Lyon."},"konnectors":{"description":"Requis pour vérifier la présence des connecteurs Enedis, GRDF et Eau du Grand Lyon ainsi que pour pouvoir les configurer à partir de l’application Ecolyo."},"accounts":{"description":"Requis pour stocker des informations propres aux comptes énergie et eau (Enedis, GRDF, Eau du Grand Lyon). Sont stockés votre numéro de PDL pour Enedis, votre numéro de PCE pour GRDF, vos logins et mots de passe pour Eau du Grand Lyon."},"triggers":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"jobs":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"terms":{"description":"Nécessaire pour la gestion des consentements de l'application"},"apps":{"description":"Requis par Cozy pour afficher les icônes des applications installées dans la barre Cozy."},"settings":{"description":"Requis pour afficher les paramètres Cozy dans la barre Cozy."},"ecolyo-dju":{"description":"Requis pour la récupération des DJU (Degrés Jours Unifiés), informations météorologiques permettant d’ajuster le modèle de comparaison des consommations énergétiques."},"dacc-dev":{"description":"Requis pour la récupération et l’envoi de statistiques d’utilisation anonymisées dans un environnement de test."},"dacc":{"description":"Requis pour envoyer des statistiques d'utilisation anonymisées."},"backoffice-rec":{"description":"Requis pour la récupération des données de la newsletter dans un environment de test."},"backoffice":{"description":"Requis pour la récupération des données de la newsletter."},"backoffice-partners-info-rec":{"description":"Requis pour la récupération du status des services partenaires dans un environment de test."},"backoffice-partners-info":{"description":"Requis pour la récupération du status des services partenaires"},"backoffice-prices-rec":{"description":"Requis pour la récupération du prix des fluides dans un environnement de test."},"backoffice-prices":{"description":"Requis pour la récupération du prix des fluides."}}},"en":{"short_description":"Ecolyo a free service developed by Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home.","long_description":"Ecolyo a free service developed by the Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home. To help you in reducing your daily consumption it gives you best energy consumption practices, consumption analysis and challenges to take up. At least one Smartmeter is needed among Linky (for electricity), Gazpar (for gas) or Téléo (for water).","permissions":{"ecolyo":{"description":"Required for the operation of the different parts of the application (Analysis, customized eco-gesture lists, etc...)."},"enedis":{"description":"Required for the display and analysis of your electricity consumption in Ecolyo. Retrieved by the Enedis connector."},"grdf":{"description":"Required for the display and analysis of your gas consumption in Ecolyo. Retrieved by the GRDF connector."},"egl":{"description":"Required for the display and analysis of your water consumption in Ecolyo. Retrieved by the Eau du Grand Lyon connector."},"konnectors":{"description":"Required to verify the presence of the Enedis, GRDF and Eau du Grand Lyon connectors as well as to be able to configure them from the Ecolyo application."},"accounts":{"description":"Required to store information specific to energy and water accounts (Enedis, GRDF, Eau du Grand Lyon). Your PDL number for Enedis, your PCE number for GRDF, your logins and passwords for Eau du Grand Lyon are stored."},"triggers":{"description":"Required for the correct functioning of the energy and water connectors."},"jobs":{"description":"Required for the correct functioning of the energy and water connectors."},"terms":{"description":"Required for the correct managment of CGU."},"apps":{"description":"Required to display the icons of installed applications in the Cozy bar."},"settings":{"description":"Required for the application's consents managment"},"ecolyo-dju":{"description":"Required to gather udd data (Unified Degree Days), a meteorological data allowing the app to adjust our energical consumption model. "},"dacc-dev":{"description":"Required for gathering and sending anonymous usage statistics for test environment."},"dacc":{"description":"Required for sending cozy anonymized stats."},"backoffice-rec":{"description":"Required for retrieving newsletter informations from backoffice rec."},"backoffice":{"description":"Required for retrieving newsletter informations from backoffice prod."},"backoffice-partners-info-rec":{"description":"Required for getting the status of partners' services in test environment."},"backoffice-partners-info":{"description":"Required for getting the status of partners' services"},"backoffice-prices-rec":{"description":"Required for getting fluid prices form backoffice rec."},"backoffice-prices":{"description":"Required for getting fluid prices form backoffice prod"}}}},"langs":["fr"],"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"routes":{"/":{"folder":"/","index":"index.html","public":false}},"services":{"enedisHalfHourMonthlyAnalysis":{"type":"node","file":"services/enedisHalfHourMonthlyAnalysis/ecolyo.js","trigger":"@cron 0 0 8 3 * *"},"monthlyReportNotification":{"type":"node","file":"services/monthlyReportNotification/ecolyo.js","trigger":"@cron 0 0 10 3 * *"},"consumptionAlert":{"type":"node","file":"services/consumptionAlert/ecolyo.js","trigger":"@cron 0 3 * * *"},"aggregatorUsageEvents":{"type":"node","file":"services/aggregatorUsageEvents/ecolyo.js","trigger":"@cron 0 1 * * *"},"fluidsPrices":{"type":"node","file":"services/fluidsPrices/ecolyo.js","trigger":"@cron 0 2 * * *"}},"permissions":{"ecolyo":{"type":"com.grandlyon.ecolyo.*"},"enedis":{"type":"com.grandlyon.enedis.*"},"grdf":{"type":"com.grandlyon.grdf.*"},"egl":{"type":"com.grandlyon.egl.*"},"konnectors":{"type":"io.cozy.konnectors"},"accounts":{"type":"io.cozy.accounts"},"triggers":{"type":"io.cozy.triggers"},"jobs":{"type":"io.cozy.jobs"},"terms":{"type":"io.cozy.terms"},"apps":{"type":"io.cozy.apps","verbs":["GET"]},"settings":{"type":"io.cozy.settings","verbs":["GET"]},"ecolyo-dju":{"type":"org.ecolyo.dju","verbs":["GET"]},"dacc":{"type":"cc.cozycloud.dacc_v2","verbs":["ALL"]},"dacc-dev":{"type":"cc.cozycloud.dacc.dev_v2","verbs":["ALL"]},"backoffice-rec":{"type":"org.ecolyo.backoffice.rec","verbs":["ALL"]},"backoffice-prod":{"type":"org.ecolyo.backoffice","verbs":["ALL"]},"backoffice-partners-info-rec":{"type":"org.ecolyo.backoffice.partners.info.rec","verbs":["ALL"]},"backoffice-partners-info":{"type":"org.ecolyo.backoffice.partners.info","verbs":["ALL"]},"backoffice-prices-rec":{"type":"org.ecolyo.backoffice.prices.rec","verbs":["ALL"]},"backoffice-prices":{"type":"org.ecolyo.backoffice.prices","verbs":["ALL"]}}}
 
 /***/ }),
 
@@ -31845,7 +31847,7 @@ var Bar = function Bar(_ref) {
     id: "stop-color-2",
     offset: "100%"
   }))), /*#__PURE__*/_react.default.createElement("path", {
-    d: topRoundedRect(showCompare ? getBandWidth() : 0, 0, getBandWidth(), height - yScaleValue),
+    d: topRoundedRect(showCompare ? getBandWidth() : 0, 0, weekdays ? 1 : getBandWidth(), height - yScaleValue),
     fill: "url(#gradient)",
     className: isDuel ? 'bar-duel' : barClass,
     onClick: handleClick,
@@ -32602,7 +32604,6 @@ var _userExploration = __webpack_require__("/rev");
 
 var _global = __webpack_require__("c4IZ");
 
-/* eslint-disable @typescript-eslint/camelcase */
 var useExploration = function useExploration() {
   var client = (0, _cozyClient.useClient)();
   var dispatch = (0, _reactRedux.useDispatch)();
@@ -35207,7 +35208,6 @@ var ConsumptionFormatterService = /*#__PURE__*/function () {
             minutes: 30
           };
 
-        case _timeStep.TimeStep.HALF_AN_HOUR:
         case _timeStep.TimeStep.DAY:
           return {
             days: 1
@@ -35725,7 +35725,7 @@ var ActionModal = function ActionModal(_ref) {
   }), /*#__PURE__*/_react.default.createElement("div", {
     className: "action-title text-16-normal"
   }, t('action.duration', {
-    // eslint-disable-next-line @typescript-eslint/camelcase
+    // eslint-disable-next-line camelcase
     smart_count: action.actionDuration
   })), /*#__PURE__*/_react.default.createElement("div", {
     className: "action-text text-16-normal"
@@ -36731,7 +36731,7 @@ var ExplorationService = /*#__PURE__*/function () {
               case 0:
                 challengeService = new _challenge.default(this._client);
                 _context7.t0 = explorationID;
-                _context7.next = _context7.t0 === _userExploration.UserExplorationID.EXPLORATION007 ? 4 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION002 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION004_0 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION005 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION007 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION004 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION003 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION008 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION001 ? 9 : 10;
+                _context7.next = _context7.t0 === _userExploration.UserExplorationID.EXPLORATION007 ? 4 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION002 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION004_0 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION005 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION004 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION003 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION008 ? 9 : _context7.t0 === _userExploration.UserExplorationID.EXPLORATION001 ? 9 : 10;
                 break;
 
               case 4:
diff --git a/index.html b/index.html
index 5497a240388a87b642f755af928d2c8d9a4f8850..2444f75c926ebdfd13836a96fcd894197033620c 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=0,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.c1180bc5cd66dfd3234e.js"></script><script src="app/ecolyo.661ca74a9860cde92f98.js"></script></div></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=0,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.c1180bc5cd66dfd3234e.js"></script><script src="app/ecolyo.3c2e62dde4e0b2837300.js"></script></div></body></html>
\ No newline at end of file
diff --git a/manifest.webapp b/manifest.webapp
index 440b229cea46161b3a64034bf086ef623b631862..1e28781a82fca0475616c565e8cb92e10d37aa4b 100644
--- a/manifest.webapp
+++ b/manifest.webapp
@@ -5,7 +5,7 @@
   "categories": [
     "energy"
   ],
-  "version": "1.10.2",
+  "version": "1.11.0",
   "licence": "AGPL-3.0",
   "editor": "Métropole de Lyon",
   "default_locale": "fr",
diff --git a/serviceWorker.js b/serviceWorker.js
index 0f14f5b13d69bb7fad30392b70a118150352a9ce..15a90d79b460d82998693aea1a1fc403f0e478d8 100644
--- a/serviceWorker.js
+++ b/serviceWorker.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-undef */
 const staticCacheName = 'ecolyo-v1'
 const urlsToCache = ['index.html', 'offline.html']
 
diff --git a/services/aggregatorUsageEvents/ecolyo.js b/services/aggregatorUsageEvents/ecolyo.js
index db858746f6bee262f56eaea5f2adfa3f70edb796..6287aad99a019fd5dfcc6ec61e4fe90c392e5c89 100644
--- a/services/aggregatorUsageEvents/ecolyo.js
+++ b/services/aggregatorUsageEvents/ecolyo.js
@@ -137,9 +137,9 @@ var _profileType = __webpack_require__(1031);
 
 var _fluidSlug = __webpack_require__(1035);
 
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
 
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 const log = _cozyLogger.default.namespace('aggregatorUsageEvents');
 
@@ -232,11 +232,11 @@ const handleQuizStars = async (events, client) => {
       measureName: _dacc.DaccEvent.QUIZ_STARS,
       startDate: event.startDate ? event.startDate.toISODate() : '',
       value: parseInt(event.result ? event.result : '0'),
-      // eslint-disable-next-line @typescript-eslint/camelcase
+      // eslint-disable-next-line camelcase
       group1: {
         challenge_id: event.context ? event.context : ''
       },
-      // eslint-disable-next-line @typescript-eslint/camelcase
+      // eslint-disable-next-line camelcase
       group2: {
         quiz_id: event.target ? event.target : ''
       }
@@ -264,11 +264,11 @@ const calculSessionTime = async (events, client) => {
           measureName: _dacc.DaccEvent.SESSION_DURATION,
           startDate: startSessionDate.toISODate(),
           value: duration === undefined ? 0 : duration,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             number_pages: navigationCount.toString()
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             session_type: isFirstConnection ? 'first' : 'any'
           }
@@ -292,11 +292,11 @@ const calculSessionTime = async (events, client) => {
           measureName: _dacc.DaccEvent.SESSION_DURATION,
           startDate: startSessionDate.toISODate(),
           value: duration === undefined ? 0 : duration,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             number_pages: navigationCount.toString()
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             session_type: isFirstConnection ? 'first' : 'any'
           }
@@ -316,11 +316,11 @@ const calculPeriodBetweenFirstConnectionAndFirstChallenge = async (events, first
       measureName: _dacc.DaccEvent.EVENT_DURATION,
       startDate: firstConnectionEvent.eventDate.toISODate(),
       value: challengeLaunchEvents[0].eventDate.diff(firstConnectionEvent.eventDate).seconds,
-      // eslint-disable-next-line @typescript-eslint/camelcase
+      // eslint-disable-next-line camelcase
       group1: {
         start_event: 'first_session'
       },
-      // eslint-disable-next-line @typescript-eslint/camelcase
+      // eslint-disable-next-line camelcase
       group2: {
         end_event: 'first_challenge'
       },
@@ -356,11 +356,11 @@ const calculPeriodBetweenChallenge = async (events, client) => {
             measureName: _dacc.DaccEvent.EVENT_DURATION,
             startDate: allEndedChallengeEvents[previousEndedChallengeIndex].eventDate.toISODate(),
             value: event.eventDate.diff(allEndedChallengeEvents[previousEndedChallengeIndex].eventDate).seconds,
-            // eslint-disable-next-line @typescript-eslint/camelcase
+            // eslint-disable-next-line camelcase
             group1: {
               start_event: 'first_session'
             },
-            // eslint-disable-next-line @typescript-eslint/camelcase
+            // eslint-disable-next-line camelcase
             group2: {
               end_event: 'first_challenge'
             },
@@ -584,16 +584,16 @@ const calculateConsumptionVariation = async client => {
           }).startOf('day').toISODate(),
           value: consumptionData[fluidType] && consumptionData[fluidType].percentageVariation ? consumptionData[fluidType].percentageVariation : 0,
           // in percent
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             fluid_type: _fluid2.FluidType[fluidType].toLowerCase()
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             seniority: Math.round(seniority).toString()
           },
           group3: {
-            // eslint-disable-next-line @typescript-eslint/camelcase
+            // eslint-disable-next-line camelcase
             fluid_usage: await buildProfileWithFuildType(client, (0, _utils.getFluidType)(_fluid2.FluidType[fluidType]))
           }
         }; // if user wasnt connected during current month, dont send indicator
@@ -690,7 +690,7 @@ const sendEmailSubscription = async client => {
         keepLocalTime: true
       }).startOf('day').toISODate(),
       value: profile.sendAnalysisNotification ? 1 : 0,
-      // eslint-disable-next-line @typescript-eslint/camelcase
+      // eslint-disable-next-line camelcase
       group1: {
         event_type: 'subscribed'
       }
@@ -713,11 +713,11 @@ const sendHalfHourConsumption = async client => {
   const halfHourConsumption = {
     createdBy: 'ecolyo',
     measureName: _dacc.DaccEvent.FLUID_DATA_GRANULARITY,
-    // eslint-disable-next-line @typescript-eslint/camelcase
+    // eslint-disable-next-line camelcase
     group1: {
       fluid_type: 'electricity'
     },
-    // eslint-disable-next-line @typescript-eslint/camelcase
+    // eslint-disable-next-line camelcase
     group2: {
       granularity: 'half_hour'
     },
@@ -796,7 +796,7 @@ const sendKonnectorEvents = async client => {
         const konnectorSuccess = {
           createdBy: 'ecolyo',
           measureName: _dacc.DaccEvent.PARTNER_SUCESS_MONTHLY,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             fluid_type: slug
           },
@@ -850,7 +850,7 @@ const sendKonnectorAttemptsMonthly = async client => {
     const konnectorAttempts = {
       createdBy: 'ecolyo',
       measureName: _dacc.DaccEvent.UNINITIALIZED_KONNECTOR_ATTEMPTS_MONTHLY,
-      // eslint-disable-next-line @typescript-eslint/camelcase
+      // eslint-disable-next-line camelcase
       group1: {
         slug: slug
       },
@@ -1003,11 +1003,11 @@ const aggregateEvents = async (events, eventType, firstConnectionEvent, client)
           measureName: _dacc.DaccEvent.EVENT_DURATION,
           startDate: event.eventDate.toISODate(),
           value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             start_event: 'start_challenge'
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             end_event: 'end_challenge'
           },
@@ -1035,11 +1035,11 @@ const aggregateEvents = async (events, eventType, firstConnectionEvent, client)
           measureName: _dacc.DaccEvent.EVENT_DURATION,
           startDate: event.eventDate.toISODate(),
           value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             start_event: 'start_exploration'
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             end_event: 'end_exploration'
           },
@@ -1063,11 +1063,11 @@ const aggregateEvents = async (events, eventType, firstConnectionEvent, client)
           measureName: _dacc.DaccEvent.EVENT_DURATION,
           startDate: event.eventDate.toISODate(),
           value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             start_event: 'start_action'
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             end_event: 'end_action'
           },
@@ -1091,11 +1091,11 @@ const aggregateEvents = async (events, eventType, firstConnectionEvent, client)
           measureName: _dacc.DaccEvent.EVENT_DURATION,
           startDate: event.eventDate.toISODate(),
           value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             start_event: 'start_duel'
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             end_event: 'end_duel'
           },
@@ -1129,11 +1129,11 @@ const aggregateEvents = async (events, eventType, firstConnectionEvent, client)
           measureName: _dacc.DaccEvent.EVENT_DURATION,
           startDate: event.eventDate.toISODate(),
           value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             start_event: 'start_duel'
           },
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group2: {
             end_event: 'start_duel'
           },
@@ -1162,7 +1162,7 @@ const aggregateEvents = async (events, eventType, firstConnectionEvent, client)
           measureName: _dacc.DaccEvent.SUMMARY_SUBSCRIPTION_MONTHLY,
           startDate: event.eventDate.toISODate(),
           value: 1,
-          // eslint-disable-next-line @typescript-eslint/camelcase
+          // eslint-disable-next-line camelcase
           group1: {
             event_type: 'email'
           }
@@ -78932,9 +78932,9 @@ var _date = __webpack_require__(616);
 
 var _fluidConfig = _interopRequireDefault(__webpack_require__(614));
 
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
 
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 class ConsumptionFormatterService {
   formatGraphData(data, timePeriod, timeStep, fluidType, fluidStatus) {
@@ -79077,7 +79077,6 @@ class ConsumptionFormatterService {
           minutes: 30
         };
 
-      case _timeStep.TimeStep.HALF_AN_HOUR:
       case _timeStep.TimeStep.DAY:
         return {
           days: 1
@@ -80252,6 +80251,7 @@ __webpack_require__.r(__webpack_exports__);
 
 const inBrowser = typeof window !== 'undefined'
 
+// eslint-disable-next-line no-undef
 const minilog = (inBrowser && window.minilog) || _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default.a
 
 const log = minilog('ecolyo')
@@ -80560,7 +80560,7 @@ class TriggerService {
 
   async fetchTriggerState(trigger) {
     try {
-      const triggerState = await this._client.getStackClient().fetchJSON('GET', `/jobs/triggers/${trigger._id}`); // eslint-disable-next-line @typescript-eslint/camelcase
+      const triggerState = await this._client.getStackClient().fetchJSON('GET', `/jobs/triggers/${trigger._id}`); // eslint-disable-next-line camelcase
 
       return triggerState.data.attributes.current_state ? triggerState.data.attributes.current_state : null;
     } catch (error) {
@@ -94843,7 +94843,7 @@ const importIconbyId = async (id, pathType) => {
   let importedChallengeIcon;
 
   try {
-    importedChallengeIcon = await __webpack_require__(850)(`./${pathType}/${id}.svg`);
+    importedChallengeIcon = await __webpack_require__(850)(`./${pathType}/${id}.svg`); // eslint-disable-next-line no-empty
   } catch (e) {}
 
   if (importedChallengeIcon) {
@@ -98432,7 +98432,6 @@ class ExplorationService {
       case _userExploration.UserExplorationID.EXPLORATION002:
       case _userExploration.UserExplorationID.EXPLORATION004_0:
       case _userExploration.UserExplorationID.EXPLORATION005:
-      case _userExploration.UserExplorationID.EXPLORATION007:
       case _userExploration.UserExplorationID.EXPLORATION004:
       case _userExploration.UserExplorationID.EXPLORATION003:
       case _userExploration.UserExplorationID.EXPLORATION008:
diff --git a/services/consumptionAlert/ecolyo.js b/services/consumptionAlert/ecolyo.js
index 9c88569e22f283f2d3420252a99fbc9e96ddc2bf..3db9211d8bc7160b0b7a29e990ae385b5317d887 100644
--- a/services/consumptionAlert/ecolyo.js
+++ b/services/consumptionAlert/ecolyo.js
@@ -77562,9 +77562,9 @@ var _date = __webpack_require__(616);
 
 var _fluidConfig = _interopRequireDefault(__webpack_require__(614));
 
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
 
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 class ConsumptionFormatterService {
   formatGraphData(data, timePeriod, timeStep, fluidType, fluidStatus) {
@@ -77707,7 +77707,6 @@ class ConsumptionFormatterService {
           minutes: 30
         };
 
-      case _timeStep.TimeStep.HALF_AN_HOUR:
       case _timeStep.TimeStep.DAY:
         return {
           days: 1
@@ -78882,6 +78881,7 @@ __webpack_require__.r(__webpack_exports__);
 
 const inBrowser = typeof window !== 'undefined'
 
+// eslint-disable-next-line no-undef
 const minilog = (inBrowser && window.minilog) || _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default.a
 
 const log = minilog('ecolyo')
@@ -79435,7 +79435,7 @@ const importIconbyId = async (id, pathType) => {
   let importedChallengeIcon;
 
   try {
-    importedChallengeIcon = await __webpack_require__(850)(`./${pathType}/${id}.svg`);
+    importedChallengeIcon = await __webpack_require__(850)(`./${pathType}/${id}.svg`); // eslint-disable-next-line no-empty
   } catch (e) {}
 
   if (importedChallengeIcon) {
@@ -80927,8 +80927,11 @@ const consumptionAlert = async ({
 
   if (fetchedData && fetchedData.length > 0) {
     fetchedData.forEach(element => {
-      if (element.value && element.value > lastDayValue) {
+      if (element.value) {
         lastDayValue = element.value;
+      }
+
+      if (element.date) {
         alertDay = element.date;
       }
     });
@@ -80978,6 +80981,7 @@ Object.defineProperty(exports, "__esModule", {
 });
 exports.default = void 0;
 
+/* eslint-disable @typescript-eslint/no-explicit-any */
 class MailService {
   async SendMail(client, mailInfo) {
     try {
diff --git a/services/enedisHalfHourMonthlyAnalysis/ecolyo.js b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js
index b6c2a43bbb9d59f1b27c05a86c6ee1cd44d1876d..f2c4cdbaa452a5bfdad9dd369de692f7de214dc9 100644
--- a/services/enedisHalfHourMonthlyAnalysis/ecolyo.js
+++ b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js
@@ -77472,9 +77472,9 @@ var _date = __webpack_require__(616);
 
 var _fluidConfig = _interopRequireDefault(__webpack_require__(614));
 
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
 
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 class ConsumptionFormatterService {
   formatGraphData(data, timePeriod, timeStep, fluidType, fluidStatus) {
@@ -77617,7 +77617,6 @@ class ConsumptionFormatterService {
           minutes: 30
         };
 
-      case _timeStep.TimeStep.HALF_AN_HOUR:
       case _timeStep.TimeStep.DAY:
         return {
           days: 1
@@ -78792,6 +78791,7 @@ __webpack_require__.r(__webpack_exports__);
 
 const inBrowser = typeof window !== 'undefined'
 
+// eslint-disable-next-line no-undef
 const minilog = (inBrowser && window.minilog) || _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default.a
 
 const log = minilog('ecolyo')
diff --git a/services/fluidsPrices/ecolyo.js b/services/fluidsPrices/ecolyo.js
index 34ae9d3fc5a9e21b2a2ced5adfc52367db1c1ea8..6cd7604f864a6f9a3c5522fc8dac2741c97baed4 100644
--- a/services/fluidsPrices/ecolyo.js
+++ b/services/fluidsPrices/ecolyo.js
@@ -77472,9 +77472,9 @@ var _date = __webpack_require__(616);
 
 var _fluidConfig = _interopRequireDefault(__webpack_require__(614));
 
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
 
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 class ConsumptionFormatterService {
   formatGraphData(data, timePeriod, timeStep, fluidType, fluidStatus) {
@@ -77617,7 +77617,6 @@ class ConsumptionFormatterService {
           minutes: 30
         };
 
-      case _timeStep.TimeStep.HALF_AN_HOUR:
       case _timeStep.TimeStep.DAY:
         return {
           days: 1
@@ -78792,6 +78791,7 @@ __webpack_require__.r(__webpack_exports__);
 
 const inBrowser = typeof window !== 'undefined'
 
+// eslint-disable-next-line no-undef
 const minilog = (inBrowser && window.minilog) || _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default.a
 
 const log = minilog('ecolyo')
@@ -79854,6 +79854,7 @@ const aggregatePrices = async (qr, cdm, firstDate, today, fluidType) => {
   const tsa = [_timeStep.TimeStep.MONTH, _timeStep.TimeStep.YEAR];
   log('debug', `Aggregation started for fluid: ${fluidType}, from ${firstDate}  `);
   await Promise.all(tsa.map(async ts => {
+    // eslint-disable-next-line no-async-promise-executor
     return new Promise(async resolve => {
       let date = _luxon.DateTime.local();
 
@@ -79979,6 +79980,7 @@ const applyPrices = async (client, fluidType) => {
 
 
       await Promise.all(tsa.map(async timeStep => {
+        // eslint-disable-next-line no-async-promise-executor
         return new Promise(async resolve => {
           let date = _luxon.DateTime.local().setZone('utc', {
             keepLocalTime: true
diff --git a/services/monthlyReportNotification/ecolyo.js b/services/monthlyReportNotification/ecolyo.js
index 2d7ae76e5d348f281a6a49b35825a07eec4cbf42..b64c28c1d2b69261e49d446b960f446c83efccc7 100644
--- a/services/monthlyReportNotification/ecolyo.js
+++ b/services/monthlyReportNotification/ecolyo.js
@@ -77562,9 +77562,9 @@ var _date = __webpack_require__(616);
 
 var _fluidConfig = _interopRequireDefault(__webpack_require__(614));
 
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
 
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 class ConsumptionFormatterService {
   formatGraphData(data, timePeriod, timeStep, fluidType, fluidStatus) {
@@ -77707,7 +77707,6 @@ class ConsumptionFormatterService {
           minutes: 30
         };
 
-      case _timeStep.TimeStep.HALF_AN_HOUR:
       case _timeStep.TimeStep.DAY:
         return {
           days: 1
@@ -78882,6 +78881,7 @@ __webpack_require__.r(__webpack_exports__);
 
 const inBrowser = typeof window !== 'undefined'
 
+// eslint-disable-next-line no-undef
 const minilog = (inBrowser && window.minilog) || _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default.a
 
 const log = minilog('ecolyo')
@@ -79435,7 +79435,7 @@ const importIconbyId = async (id, pathType) => {
   let importedChallengeIcon;
 
   try {
-    importedChallengeIcon = await __webpack_require__(850)(`./${pathType}/${id}.svg`);
+    importedChallengeIcon = await __webpack_require__(850)(`./${pathType}/${id}.svg`); // eslint-disable-next-line no-empty
   } catch (e) {}
 
   if (importedChallengeIcon) {
@@ -80868,6 +80868,7 @@ Object.defineProperty(exports, "__esModule", {
 });
 exports.default = void 0;
 
+/* eslint-disable @typescript-eslint/no-explicit-any */
 class MailService {
   async SendMail(client, mailInfo) {
     try {