Economies d'énergie: Le challenge par rapport à l'année N-1 - Plotly

Bonjour à tous,

A l’heure où l’hiver arrive, je viens partager ma dernière idée concernant une carte permettant les économies d’énergie. Voir également ici: Analysis of electricity consumption compared with the previous year · dbuezas/lovelace-plotly-graph-card · Discussion #334 · GitHub

L’idée principale est la suivante:

Comment se compare ma consommation actuelle en temps réel par rapport à l’année précédente ?

On pourrait penser que la fonction Compare du dashboard energy fait cette fonction, mais comparer le mois de septembre par rapport au mois d’août n’a aucun sens.

Mon idée dans le détail:

  • On compare le mois de septembre par rapport au mois de septembre de l’année précédente
  • Les habitudes ne sont pas les mêmes le dimanche et le lundi , on compare donc des jours identiques, un dimanche par rapport à un dimanche, il faut pour cela décaler d’un jour (deux pour les années bissextiles le 1er mars 2024) pour synchroniser les mêmes jours de l’année avec l’année N-1
  • On affiche également les températures extérieures N et N-1 pour comprendre les écarts de consommation
  • On fait du temps réel quasi temps réel (à l’heure près en fait) pour pouvoir comparer à un instant donné la situation et l’ajuster si nécessaire.
  • On affiche les prévisions de température pour la semaine à venir et les projections de l’année précédente.

Les prérequis:

  • Avoir un suivi historique de la consommation électrique (avec remise à zéro chaque jour pour l’instant) type Linky de plus d’un an
  • Avoir un suivi historique de la température extérieure supérieure à un an
  • Avoir installé Plotly et la carte qui va avec
  • Avoir installé OpenweatherMap pour les prévisions

Le résultat:

En plus gros:

Pour chaque jour, heure par heure:

  • En jaune sombre, la consommation de l’année précédente
  • En jaune , la consommation de l’année en cours

Remarque: Dans l’exemple affiché, je consomme plus que l’année précédente, mais les températures sont plus basses.

Comment lire ?
Quand le jaune dépasse le jaune sombre, on consomme plus que l’année précédente
Sinon, c’est le contraire.

  • En vert la température extérieure
  • En rouge la température intérieure
  • La zone grisée entre les deux, affiche l’écart de température (et donc l’energie nécessaire)

En vert pointillé, la température extérieure année N-1 et rouge pointillé (assez peu visible) la température intérieure N-1

Sur la droite, la barre verticale bleu pointillée donne l’instant présent et la ligne verte donne les prévisions openweathermap pour la semaine à venir.

En déplçant à droite, on a l’affichage des données de l’année N-1:

On peut dezoomer au niveau de la journée:

Note: Je n’ai qu’un peu plus d’un an de données historiques, ce qui explique qu’il manque les barres jaunes sombres sur la majorité du graphique.

On peut dezoomer au niveau de la semaine:

On peut dezoomer au niveau d’une année:

Plotly Electricity Analysis

Plotly étant dynamique (zooms heure, jour,semaine, mois), transitions, déplacements dans le temps, affichage/masque d’indicateurs), il y a enormément de possibilités d’analyses sur le même graphique !

Et dans l’utilisation, tout est dynamique et fluide !
Plotly Fluidité

Et le code de la carte Lovelace qui change tous les jours, parce que Plotly pour Home Assistant est complexe, assez peu documenté et que je ne suis pas un développeur:

type: custom:plotly-graph
layout:
  barmode: overlay
  margin:
    r: 100
  xaxis:
    rangeselector:
      'y': 1.3
      buttons:
        - count: 1
          step: day
        - count: 7
          step: day
        - count: 14
          step: day
        - count: 1
          step: month
        - count: 3
          step: month
        - count: 6
          step: month
        - count: 16
          step: month
    centered: false
  yaxis:
    visible: true
    fixedrange: true
    autorange_after_scroll: true
  yaxis2:
    visible: true
    fixedrange: true
    autorange_after_scroll: true
    rangegmode: tozero
    rangemode: nonnegative
  yaxis5:
    visible: false
    fixedrange: true
    autorange_after_scroll: true
    rangegmode: tozero
    rangemode: nonnegative
  yaxis7:
    visible: false
    fixedrange: true
    autorange_after_scroll: true
    rangegmode: tozero
    rangemode: nonnegative
  yaxis9:
    visible: false
    fixedrange: true
    autorange_after_scroll: true
entities:
  - entity: ''
    yaxis: y9
    name: Now
    showlegend: false
    line:
      width: 1
      dash: dot
      color: deepskyblue
    x: $ex [Date.now(), Date.now()]
    'y':
      - 0
      - 1
  - entity: sensor.humidite_station_meteo
    autorange_after_scroll: true
    yaxis: y5
    base: 0
    connectgaps: true
    statistic: mean
    line:
      shape: spline
      width: 1
      dash: none
      color: rgba(120, 120, 240, 1)
    period:
      0m: hour
      1M: day
      3M: week
      6M: week
    time_offset: +0d
    name: Humidité
    show_value: true
    opacity: 0.4
    fill: tozeroy
    fillcolor: rgba(168, 216, 234, 0)
  - entity: sensor.humidite_station_meteo
    autorange_after_scroll: true
    yaxis: y5
    base: 0
    connectgaps: true
    statistic: mean
    line:
      shape: spline
      width: 1
      dash: dot
      color: rgba(120, 120, 240, 0.5)
    period:
      0m: hour
      1M: day
      3M: week
      6M: week
    time_offset: +364d
    name: Humidité A-1
    show_value: true
    opacity: 0.4
    fill: tozeroy
    fillcolor: rgba(168, 216, 234, 0)
  - entity: sensor.temperature_station_meteo
    autorange_after_scroll: true
    yaxis: y2
    base: 0
    connectgaps: true
    statistic: mean
    line:
      shape: spline
      width: 1
      dash: dot
      color: rgba(40, 240, 40, 1)
    period:
      0m: hour
      1M: day
      3M: week
      6M: month
    time_offset: +364d
    name: Température Ext. A-1
    show_value: true
    opacity: 0.4
    fill: none
    fillcolor: rgba(168, 216, 234, 0.1)
  - entity: sensor.openweathermap_temperature
    autorange_after_scroll: true
    legendgroup: 2
    yaxis: y2
    base: 0
    name: 🌡 Temperature
    internal: true
    filters:
      - store_var: temperature
    fill: none
    fillcolor: rgba(214, 39, 40,0)
    line:
      color: rgba(214, 39, 40, 0)
  - entity: weather.openweathermap
    autorange_after_scroll: true
    legendgroup: 2
    yaxis: y2
    base: 0
    showlegend: true
    show_value: true
    name: Température Ext. Prév.
    fill: none
    fillcolor: rgba(214, 39, 40, .3)
    line:
      dash: none
      shape: spline
      color: rgba(50,205,50, 1)
      width: 1
    unit_of_measurement: °C
    filters:
      - fn: |-
          ({ meta, vars }) => ({
            xs: [vars.temperature.xs.slice(-1)[0],...meta.forecast.map(({ datetime }) => new Date(datetime))],
            ys: [vars.temperature.ys.slice(-1)[0],...meta.forecast.map(({ temperature }) => temperature)],
          })
  - entity: sensor.temperature_station_meteo
    autorange_after_scroll: true
    yaxis: y2
    base: 0
    statistic: mean
    line:
      shape: spline
      color: rgba(50,205,50, 1)
      width: 1
    period:
      0m: hour
      1M: day
      3M: week
      6M: month
    time_offset: +0d
    name: Température Ext.
    show_value: true
    opacity: 0.4
    fill: tozeroy
    fillcolor: rgba(168, 216, 234, 0)
  - entity: sensor.temperature_interieure_climatisation_salon
    autorange_after_scroll: true
    yaxis: y2
    base: 0
    statistic: mean
    line:
      shape: spline
      color: rgba(178,34,34, 1)
      width: 1
    period:
      0m: hour
      1M: day
      3M: week
      6M: month
    time_offset: +0d
    name: Température Int.
    show_value: true
    opacity: 1
    fill: tonexty
    fillcolor: rgba(168, 216, 234, 0.05)
  - entity: sensor.temperature_interieure_climatisation_salon
    autorange_after_scroll: true
    yaxis: y2
    statistic: mean
    base: 0
    line:
      shape: spline
      color: rgba(178,34,34, 1)
      width: 1
      dash: dot
    period:
      0m: hour
      1M: day
      3M: week
      6M: month
    time_offset: +364d
    name: Température Int. A-1
    show_value: true
    opacity: 0.4
    fill: none
    fillcolor: rgba(168, 216, 234, 0.05)
  - entity: sensor.openweathermap_rain
    autorange_after_scroll: true
    base: 0
    yaxis: y7
    fillcolor: rgba(31, 119, 180,.3)
    line:
      color: rgba(31, 119, 180, 1)
    legendgroup: 1
    name: 🌧 Précipitation 1
    visible: legendonly
    show_value: true
    filters:
      - store_var: precipitation
    fill: tozeroy
  - entity: sensor.wupws_precipitation_rate
    visible: legendonly
    autorange_after_scroll: true
    base: 0
    yaxis: y7
    fillcolor: rgba(31, 119, 180,.3)
    line:
      color: rgba(31, 119, 180, 1)
    legendgroup: 4
    name: 🌧 Précipitation 2
    show_value: true
    fill: tozeroy
    unit_of_measurement: mm/h
  - entity: weather.openweathermap
    show_value: true
    autorange_after_scroll: true
    base: 0
    legendgroup: 1
    showlegend: false
    visible: legendonly
    name: Précipitation
    fill: tozeroy
    fillcolor: rgba(31, 119, 180,.1)
    line:
      color: rgba(31, 119, 180, 1)
      dash: dot
    unit_of_measurement: mm
    filters:
      - fn: |-
          ({ meta, vars }) => ({
            xs: [vars.precipitation.xs.slice(-1)[0],...meta.forecast.map(({ datetime }) => new Date(datetime))],
            ys: [vars.precipitation.ys.slice(-1)[0],...meta.forecast.map(({ precipitation }) => precipitation)],
          })
  - entity: sensor.energy_eau_chaude
    autorange_after_scroll: true
    display: hide
    defaults:
      yaxes:
        fixedrange: true
    type: bar
    marker:
      color: rgba(220, 80, 80, 0.5)
    yaxis: 'y'
    base: 0
    statistic: state
    period:
      0m: hour
      1M: day
      3M: month
      6M: month
    time_offset: +0.0d
    unit_of_measurement: kWh
    name: Consommation Eau Chaude
    texttemplate: '%{y:0.1f} kWh'
    connectgaps: false
    fill: tozeroy
    show_value: false
    filters:
      - filter: i>0
      - delta
      - filter: y<250
      - filter: y>=0
      - map_y_numbers: 'y'
  - entity: sensor.consommation_journaliere_edf
    autorange_after_scroll: true
    defaults:
      yaxes:
        fixedrange: true
    type: line
    line:
      shape: hvh
      width: 1
      dash: none
      color: rgba(200, 200, 200, 0.6)
    fill: tozeroy
    fillcolor: rgba(20,20,20, 0.4)
    yaxis: 'y'
    base: 0
    statistic: state
    period:
      0m: hour
      1M: day
      3M: day
      6M: day
    time_offset: +364.0d
    unit_of_measurement: kWh
    name: Consommation A-1
    texttemplate: '%{y:0.1f} kWh'
    show_value: false
    filters:
      - filter: i>0
      - filter: y<150000
      - map_y_numbers: y / 1000
  - entity: sensor.consommation_journaliere_edf
    autorange_after_scroll: true
    defaults:
      yaxes:
        fixedrange: true
    type: bar
    marker:
      color: rgba(255, 215, 0, 0.5)
    yaxis: 'y'
    base: 0
    statistic: state
    period:
      0m: hour
      1M: day
      3M: day
      6M: day
    time_offset: +0.0d
    unit_of_measurement: kWh
    name: Consommation Année
    texttemplate: '%{y:0.1f} kWh'
    connectgaps: false
    fill: tozeroy
    show_value: false
    filters:
      - filter: i>0
      - filter: y<150000
      - map_y_numbers: y / 1000
  - entity: sensor.consommation_edf
    visible: true
    autorange_after_scroll: true
    defaults:
      yaxes:
        fixedrange: true
    type: bar
    barmode: overlay
    marker:
      color: rgba(200, 255, 200, 0.4)
    yaxis: 'y'
    base: 0
    statistic: state
    period:
      0m: hour
      1M: day
      3M: month
      6M: month
    time_offset: +364.0d
    unit_of_measurement: kWh
    name: Consommation période - 1
    texttemplate: '%{y:0.1f} kWh'
    connectgaps: false
    fill: tozeroy
    show_value: false
    filters:
      - filter: i>0
      - delta
      - filter: y<15000000
      - map_y_numbers: y / 1000
  - entity: sensor.consommation_edf
    visible: true
    autorange_after_scroll: true
    defaults:
      yaxes:
        fixedrange: true
    type: bar
    barmode: overlay
    marker:
      color: rgba(255, 255, 100, 0.4)
    yaxis: 'y'
    base: 0
    statistic: state
    period:
      0m: hour
      1M: day
      3M: month
      6M: month
    time_offset: +0.0d
    unit_of_measurement: kWh
    name: Consommation période
    texttemplate: '%{y:0.1f} kWh'
    connectgaps: false
    fill: tozeroy
    show_value: false
    filters:
      - filter: i>0
      - delta
      - filter: y<15000000
      - map_y_numbers: y / 1000
autorange_after_scroll: true
hours_to_show: 168
time_offset: 1d
refresh_interval: 1800

Références:

De mémoire le sensor.consommation_journaliere_edf a été créé de la façon suivante:

1 « J'aime »

Salut

Sujet intéressant et tu as visiblement pensé à plusieurs choses.

J’ai cependant une interrogation

Comparé à l’heure prêt ça me paraît un peu ambitieux.
Ça nécessite d’avoir les données (long débat) mais tu compare quoi à 17h59… La valeur année-1 à celle de 17 ou 18h?

Par ailleurs il y a plein de facteurs qui influence la conso. Le dimanche quand tu as des invités, même à météo équivalente, c’est jamais comparable (cuisine, chauffage de la chambres d’amis, eau, eau chaude)

Et pour finir, tu souhaites adapter quoi ? Genre si à la moitié de la journée, tu as déjà 90% de la conso de l’année dernière ? Tu coupes le chauffage ? Tu vires les invités ?

En rédigeant le sujet ça me rappelle un vaguement un truc similaire, n’aurais tu pas déjà parlé de ça l’année dernière ?

Concernant le code variable tous les jours, avec du decluttering on doit pourvoir traiter une partie du besoin

En tout cas, sujet intéressant, que je vais suivre attentivement

J’utilise simplement les données ‹ long historique › qui sont stockées par défaut et ne sont jamias purgées.

Je compare la consommation en kWh qu’il y a eu entre 17h00 et 17h59, par exemple 1,234 kWh cette année sur la barre jaune vs. 1,1000 kWh l’année dernière sur la barre jaune sombre.

Ouais, je coupe le chauffage et je sers le poulet sans le faire cuire :smiley:. Il y a plusieurs réponses, d’abord ça m’amuse, ensuite ça permet de voir la déviation éventuelle et de savoir s’il faudra rajouter des sous dans la facture EDF lors de la régularisation. Enfin, c’est un peu comme Ecojoko, ça incite à faire attention, mais dans les faits, il faut rester raisonnable. Et effectivement, si il faid plus froid cette année que l’année dernière, on consommera plus, il ne faut pas devenir radin et ne plus se chauffer !

Ca, c’est du chinois pour moi aujourd’hui.

Peut-être avec l’Ecojoko et le suivi de la consommation de mon ballon d’eau chaude ?

C’est un sujet intéressant, mais la véracité de l’information est bien moindre.

Il y a le chauffage qui représente énormément dans la facture énergétique, et la météo n’est pas identique aux années précédentes, c’est pour ca que je ferais plutôt un global par saison ou au pire semaine et week-end par mois.

Mais, c’est un très gros travail intéressant. Bravo

Par contre, je ne vois pas de demande d’entraide ?? je déplace dans Home Assistant - Tutoriels & Partages
PS : Il faut arrêter de mettre des [vhjsdvf] dans les titres sinon c’est la foire à la saucisse. :stuck_out_tongue_winking_eye:

1 « J'aime »

Bjr…
C’est presque une bonne idée !
Pas facile de faire une comparaison, mais cela est déjà bien !

Mais la constante de la météo joue aussi un rôle importante dans le temps .( fluctuation température, humidité et jusqu’au vent !)
Aussi la présence des personnes et le réglage des différents conso en énergie a ce moment précis.

Une comparaison de consommation !

Il y a aussi pour le coût , les évolutions des prix à la base !

Bon travail, et sujet à réfléchir !

La carte Plotly permet de zoomer/dézoomer de façon dynamique, donc on a l’information à l’heure, à la journée, à la semaine ou au mois (voire à l’année quand j’aurais 10 ans d’historique :slight_smile: )

J’ajoute que cet exemple avait aussi pour but d’utiliser Plotly qui a l’air super-puissant.

2 « J'aime »

Salut à tous

Moi j’utilise l’appli EDF pour comparer une année sur l’autre…
Cela me suffit pour voir mes progrès.
A noter qu’ayant un chauffage électrique, ma consommation est 100% corrélée avec la température extérieure, l’ensoleillement du jour et le fait que je sois à la maison ou pas donc comparer d’une année sur l’autre revient principalement à comparer les températures…
Sauf à ramener ma consommation est kW/°C mais pas évident de trouver un sens.

Oui mais tu te contredis :

laisse supposé que tu fais varier la T° interne quand absent ou présent !, donc conso ! :point_up_2: :point_down:
Du point de vue Consommation, effectivement c’est essentiel ( soit disant pour la planète) mais chacun regarde aussi sa facture ( pas dit qu’en consommant moins , ta facture baisse !) dito les évolutions des prix !

Une petite note, concernant les prix de ma facture EDF, elle est globalement stable depuis 15 ans (~240€/mois en appart’) alors que le prix EDF a plus que doublé, et que je suis passé d’une occupation d’une famille classique (tout le monde dehors du lundi au vendredi de 9h00 à 18h00) à une occupation XXIème siècle (toujours quelqu’un à la maison) qui oblige à chauffer en permanence (mais on cuisine beaucoup moins).

les principales économies ont été réalisées au fil du temps, remplacement des baies vitrées, remplacement des radiateurs à programmation statique par une programmation plus fine via HA, ajout d’une PAC et d’un poêle, LED au lieu de halogènes (ça tirait jusqu’à 500W quand même !).

Aujourd’hui, plus grand chose à économiser, sauf à baisser la température, et comme je ne suis pas écolo sauveur de planète, il ne faut exagérer non plus, c’est plutôt pour le fun et pour comprendre ma consommation que je fais ça et voir si mes habitudes évoluent ou non.

Si tu baisse ta conso ta facture baisse indirectement car elle aurait été plus élevé.

Donc on ne va parler de réduire sa facture dans le réel !
@FillR2 Quand on parle d’économie en remplaçant du matériel ( ne pas oublier le coût de ce matos!) tu vas dans le sens de l’économie planétaire ! ( et encore…).
Tu fais peur en parlant de :

Je peux pas faire de comparaison ici ( climat pas le même, maison male isolée, prix du kWh suivant trois périodes, donc en pointe on fait attention aux consommation superflus et surtout cheminée l’hiver très froid, mais pas de T° négative !)
En calcul je suis maxi 130€ par mois ( de 60/70€ maxi/mois en temps normal, à 250/300€ les 3 mois les plus défavorables).
Mais pour le fun et sa satisfaction perso OK avec toi ! Ici radiateur électrique suivi domotique surtout pour l’humidité …

ma conso est là:
image

On voit clairement l’introduction du thermostat HA en janvier 2022. Ensuite le gain avec 2023 est du à de meilleurs réglages, le déplacement d’un radiateur, l’utilisation d’un chauffage d’appoint au plus près du besoin, le début de l’hivers 2023 moins froid, un chauffage de l’eau chaude un jour sur deux… et le dernier fils qui quitte la maison.

Il faudrait faire la part des choses mais bon…

En fait, j’ai regardé quelques chiffres, voilà quelques consommations:

  • consommation appareils au minimum (veille, internet, frigos, maintien eau chaude…) : 7 kWh/j
  • consommation moyenne eau chaude: 7 kWh/j

soit 5000 kWh/an

et au total sur l’année: 12000 kWh/an * ~20 centimes = 2400€/an = 200€/mois + l’abonnement.

Edit Décembre 2023: Tableau abandonné remplacé par l’ajout d’indicateurs dans le tableau principal (voir ici): Economies d'énergie: Le challenge par rapport à l'année N-1 - Plotly - #18 par FillR2


Un petit ajout ici: Analysis of electricity consumption compared with the previous year · dbuezas/lovelace-plotly-graph-card · Discussion #334 · GitHub

Je travaille également sur un nouveau tableau qui me permet d’afficher le coût EDF en tarif standard et en tarif Heures Pleines/Heures Creuses pour voir si je gagne vraiment quelque chose:

Par jour:

Par mois:

Tu ne peux comparer que ce qui est comparable.
D’une année sur l’autre le climat n’est pas le même à la même date.

Si tu veux comparer, il te faut comparer un usage identique. Pour celà, le plus simple est de passer par un calendrier pour chaque type de présence. Par exemple un lundi n’est pas pareil que le mercredi ou le samedi avec le dimanche. Ajouté encore les périodes scolaires et la période de chauffe ou pas ainsi que les dju.

On ne travaille donc pas sur la comparaison Timeserie mais sur les valeurs indépendamment des dates

Et pour ça il te faut un échantillonage de données important. C’est mon boulot depuis 10 ans.

Je ne connais pas suffisamment HA pour faire ça et je le trouve trop rigide. Mon idée est aussi de faire un outil mais il sera externe. Comme ça je le maîtrise et il sera consultable dans HA par l’intégration SQL par exemple. Pour le moteur je pense passer par du MySQL ou du postgresql.

Pour le moment j’enregistre et je garde toutes les donnés brutes de ce qui est important sans limite de temps comme les températures, ambiance, hygrométrie, conso, etc

Certes, mais je compare les données d’une année sur l’autre en respectant les jours, mon graphique surimpose les données d’aujourd’hui dimanche 26/11/2023 à celles de dimanche 27/11/2022 il y a 364 jours.

J’affiche également les températures de Année et Année N-1 de même que l’humidité.

En fait, celà me permet de vérifier que je ne consomme pas anormalement par rapport à des conditions similaires il y a un an.

J’ajoute qu’il faut faire une interprétation, j’ai consommé plus ce week-end que le week-end équivalent il y a un an (les barres jaunes qui dépassent), mais je vois que j’étais probablement absent l’année dernière du samedi 13h00 au dimanche 16h00, donc ça s’explique.

Si tu fais un système compatible HA, ça intéressera du monde bien entendu :slight_smile:

1 « J'aime »

Plotly Electricity Analysis

Plotly étant dynamique (zooms heure, jour,semaine, mois), transitions, déplacements dans le temps, affichage/masque d’indicateurs), il y a enormément de possibilités d’analyses sur le même graphique !

Et dans l’utilisation, tout est dynamique et fluide !
Plotly Fluidité

Quelques nouveaux indicateurs intégrés avec Plotly:

Prix EDF en mode HP/HC comparé au mode standard par mois:

On peut voir que le gain est minime (entre 0 et 10 euro par mois)

Il est aussi possible de zoomer par jour, par heure, voire par 5 minutes:

Le code plotly (c’est un extrait de la carte complète) ressemble à ça:

  - entity: sensor.consommation_edf_hc
    internal: 'yes'
    statistic: state
    period:
      0m: 5minute
      25h: hour
      1M: day
      3M: month
      6M: month
    time_offset: +0.0d
    unit_of_measurement: kWh
    name: Consommation période HC
    filters:
      - filter: i>0
      - delta
      - filter: y<15000000
      - map_y_numbers: y / 1000
      - store_var: hc


  - entity: sensor.consommation_edf_hp
    internal: 'yes'
    statistic: state
    period:
      0m: 5minute
      25h: hour
      1M: day
      3M: month
      6M: month
    time_offset: +0.0d
    unit_of_measurement: kWh
    name: Consommation période HP
    filters:
      - filter: i>0
      - delta
      - filter: y<15000000
      - map_y_numbers: y / 1000
      - store_var: hp


  - entity: sensor.consommation_edf_hp
    visible: legendonly
    autorange_after_scroll: true
    defaults:
      yaxes:
        fixedrange: true
    type: bar
    barmode: overlay
    marker:
      color: rgba(255, 255, 255, 0.4)
    yaxis: y4
    base: 0
    statistic: state
    period:
      0m: 5minute
      25h: hour
      1M: day
      3M: month
      6M: month
    time_offset: +0.0d
    unit_of_measurement: €
    name: Prix euro
    texttemplate: '%{y:0.2f} €'
    connectgaps: false
    fill: tozeroy
    show_value: false
    filters:
      - filter: i>0
      - delta
      - map_y_numbers: |
          { 
            let KWHHP = vars.hp.ys[i];
            let EDFHP = 0.184;
            if (x>=new Date("2023-02-01")) EDFHP = 0.223;
            if (x>=new Date("2023-08-01")) EDFHP = 0.246;
            return KWHHP * EDFHP;
          }
      - map_y_numbers: |
          { let KWHHC = vars.hc.ys[i];
            let EDFHC = 0.147;
            if (x>=new Date("2023-02-01")) EDFHC = 0.161;
            if (x>=new Date("2023-08-01")) EDFHC = 0.1828;
            let PRIXEDFHC = KWHHC * EDFHC;
            return y + PRIXEDFHC;
          }
      - map_y_numbers: |
          { let abonnement = 19.97;
            let prix = y
            if (x>=new Date("2023-02-01")) abonnement = 19.97;
            if (x>=new Date("2023-08-01")) abonnement = 19.97;
            if (vars.hp.ys[i] + vars.hc.ys[i] >= 450) prix = y + abonnement;
            return prix;
          }

Autres indicateurs:

Prix 2023 (consommation + abonnement) par mois comparé au prix 2021 pour la même consommation (pour se faire mal) :

Autre exemple:

Coût actuel et projection des coûts mensuels à venir basée sur la consommation année précédente et le prix courant: