Création graphique 2 capteurs Kw/h + ° extérieure

Bonjour,
Je souhaite tout d’abord vous souhaiter une excellente année 2025.

J’aimerais créer un graphique qui montre la moyenne quotidienne de température extérieure (j’ai un sensor pour ça) et la consommation quotidienne de ma PAC (j’ai aussi le sensor).
Comment me conseillez-vous de le faire ?
J’arrive à afficher un graphique, j’obtiens une température moyenne (par jour, par mois ou par an), mais la consommation de la Pac est calculée sur un mois avec donc une valeur proche parfois de 2000 kw/h.
Je ne peux afficher 2000 et 10° sur le même graphique, on ne verrait rien.
Mon objectif est d’avoir un graphique quotidien avec la conso de la pac quotidienne et la température moyenne quotidienne.

Merci par avance pour vos lumières.

Hello,

Tu peux utiliser GitHub - RomRider/apexcharts-card: 📈 A Lovelace card to display advanced graphs and charts based on ApexChartsJS for Home Assistant qui est super puissant et que je trouve beau :slight_smile:

J’affiche même des booléens sur un graph, tu peux changer les échelles.

type: custom:apexcharts-card
header:
  show: true
  title: Chaufferie
  show_states: true
  colorize_states: true
graph_span: 6h
all_series_config:
  stroke_width: 2
  curve: straight
yaxis:
  - id: temperature
    min: auto
    max: auto
    decimals: 0
  - id: boolean1
    show: false
    min: 0
    max: 4
  - id: boolean2
    show: false
    min: -1
    max: 3
  - id: boolean3
    show: false
    min: -2
    max: 2
  - id: boolean4
    show: false
    min: -3
    max: 1
series:
  - entity: sensor.sonde_ecs
    yaxis_id: temperature
    show:
      legend_value: false
  - entity: sensor.retour_cogeneration
    yaxis_id: temperature
    show:
      legend_value: false
  - entity: sensor.sonde_retour_coge_circuit_chauffage
    yaxis_id: temperature
    show:
      legend_value: false
  - entity: binary_sensor.i1_chaudiere_1_compteur_marche
    transform: "return x === 'on' ? 1 : 0;"
    yaxis_id: boolean4
    type: area
    curve: stepline
    stroke_width: 0
    show:
      in_header: false
      legend_value: true
  - entity: binary_sensor.i3_chaudiere_2_compteur_marche
    transform: "return x === 'on' ? 1 : 0;"
    yaxis_id: boolean3
    type: area
    curve: stepline
    stroke_width: 0
    show:
      in_header: false
      legend_value: true
  - entity: binary_sensor.i5_demande_chauffage_regulateur
    transform: "return x === 'on' ? 1 : 0;"
    yaxis_id: boolean2
    type: area
    opacity: 0.4
    curve: stepline
    stroke_width: 0
    show:
      in_header: false
      legend_value: true
  - entity: binary_sensor.i6_marche_coge
    transform: "return x === 'on' ? 1 : 0;"
    yaxis_id: boolean1
    type: area
    curve: stepline
    opacity: 0.4
    stroke_width: 0
    show:
      in_header: false
      legend_value: true

Qui donne:

Maintenant pour toi ça serait quelque chose comme:

type: custom:apexcharts-card
header:
  show: true
  title: PAC
  show_states: true
  colorize_states: true
graph_span: 24h
yaxis:
  - id: temperature
    min: auto
    max: auto
  - id: pac
    min: auto
    max: auto
series:
  - entity: sensor.temperature
    yaxis_id: temperature
  - entity: sensor.pac_conso
    yaxis_id: pac

J’espère que ça t’aide

2 « J'aime »

Désolé mais @Cloom à répondu en meme temps que moi ! tu auras deux réponses !!
Bonjour
ca dépend du composant que tu utilises pour ecrire tes courbes.
Moi j’utilise APEX CHART et tu peux mettre une unité secondaire sur la droite.
Je te donne un exemple , mais moi mon unité secondaire est binaire, pour afficher HP et HC ; mais tu peux mettre ce que tu veux


type: custom:apexcharts-card
header:
  title: Tension réseau <24h> en V
  show: true
graph_span: 24h
yaxis:
  - id: first
    decimals: 0
    min: 200
    max: 250
    apex_config:
      tickAmount: 5
  - id: second
    opposite: true
    max: 1
    decimals: 0
    apex_config:
      tickAmount: 1
series:
  - entity: sensor.shellyem_garage_gen_voltage
    yaxis_id: first
    name: tension
    color: black
    stroke_width: 1
  - entity: input_select.tarif_elec
    yaxis_id: second
    curve: stepline
    type: area
    transform: "return x === 'HC' ? 1 : 0 ;"
    color: aqua
    stroke_width: 0
    opacity: 0.3
    show:
      in_header: false
      legend_value: false

@ Jippy

Oui pour l’unité" secondaire, mais est-ce que chaque courbe à son échelle ?
Car je vais afficher aux alentours de 0 à 100 kwh/ jours pour la PAC et entre 0 et 25° pour la température

Oui, tu choisis en créant des yaxis que tu assignés à tes series. Tu peux même laisser en auto comme dans l’exemple que je te propose pour toi

Il y a je pense de nombreuses solutions pour avoir 2 courbes avec une échelle différente.
Par exemple, tu trouveras de nombreux exemples de « mini-graph » card, comme ceci par exemple:


La température est sur l’axe y de gauche, et l’humité sur l’axe y de droite, avec bien sûr des échelles différentes.
Mini-graph : GitHub - kalkih/mini-graph-card: Minimalistic graph card for Home Assistant Lovelace UI

Tu as aussi la possibilité d’utiliser GitHub - SpangleLabs/history-explorer-card: A card for Home Assistant Lovelace for exploring the history of your entities interactively and in real time. qui a de nombreuses options de customisation.

1 « J'aime »

Merci pour vos aides.
Le problème que j’ai c’est que le graphique affiche la plus petite intervale de valeur (la mesure instantanée).
J’aimerai afficher la moyenne de température de la journée et le total de kw/h de la pac.

Voici ce que j’ai fait :

type: custom:apexcharts-card
update_interval: 1min
graph_span: 3d
yaxis:
  - id: first  # identification name of the second y-axis
    decimals: 0
 
    apex_config:
      tickAmount: 6
  - id: second # identification name of the second y-axis
    opposite: true # make it show on the right side
    decimals: 0
    apex_config:
      tickAmount: 6
all_series_config:
     stroke_width: 2
series:
  - entity: sensor.pompe_a_chaleur
    yaxis_id: first # this serie will be associated to the 'id: first' axis.
  - entity: sensor.andlau_temperature
    yaxis_id: second # this serie will be associated to the 'id: second' axis.

avec plotly

1 « J'aime »

J’ai compris que tu avais mis la moyenne dans un sensor deja !

Je pense que tu peux faire comme ça (j’ai mis un exemple avec bar et courbe):

type: custom:apexcharts-card
graph_span: 7d
yaxis:
  - id: first  # identification name of the second y-axis
    decimals: 0
  - id: second # identification name of the second y-axis
    opposite: true # make it show on the right side
    decimals: 0
all_series_config:
     stroke_width: 2
series:
  - entity: sensor.netatmo_living_room_humidity
    yaxis_id: first # this serie will be associated to the 'id: first' axis.
    group_by:
      func: avg
      duration: 24h
  - entity: sensor.netatmo_living_room_temperature
    type: column
    yaxis_id: second # this serie will be associated to the 'id: second' axis.
    group_by:
      func: avg
      duration: 24h

Qui donne:

Mon préféré ! Avec des zooms, des slides, … Très configurable.

On peut faire des trucs de malade mais des simples graphes très simples et fonctionnels (C’est le seul qui permet de faire des zoom simplement à ma connaissance).

Le code :

- type: custom:plotly-graph
  entities:
    - entity: '[[climate]]'
      attribute: temperature
      yaxis: y1
      name: Consigne
    - entity: '[[climate]]'
      attribute: current_temperature
      yaxis: y1
      name: T°
    - entity: '[[climate]]'
      attribute: ema_temp
      yaxis: y1
      name: Ema
    - entity: '[[climate]]'
      attribute: on_percent
      yaxis: y2
      name: Power percent
      fill: tozeroy
      fillcolor: rgba(200, 10, 10, 0.3)
      line:
        color: rgba(200, 10, 10, 0.9)
    - entity: '[[slope]]'
      name: Slope
      fill: tozeroy
      yaxis: y9
      fillcolor: rgba(100, 100, 100, 0.3)
      line:
        color: rgba(100, 100, 100, 0.9)
  hours_to_show: 4
  refresh_interval: 10
  height: 800
  config:
    scrollZoom: true
  layout:
    margin:
      r: 50
    legend:
      x: 0
      'y': 1.2
      groupclick: togglegroup
      title:
        side: top right
    yaxis:
      visible: true
      position: 0
    yaxis2:
      visible: true
      position: 0
      fixedrange: true
      range:
        - 0
        - 1
    yaxis9:
      visible: true
      fixedrange: false
      range:
        - -2
        - 2
      position: 1
    xaxis:
      rangeselector:
        'y': 1.1
        x: 0.7
        buttons:
          - count: 1
            step: hour
          - count: 12
            step: hour
          - count: 1
            step: day
          - count: 7
            step: day

@Limonade67 as-tu réussi à faire ce que tu voulais?

J’adore Plotly Graph Card pour les zooms mais je le trouve pas très sexy. Je lui préfère Apex ou Mini graph card pour le style et j’ai des plotly dans des dashboards différents qui sont plus là pour le coté technique et chercher des informations précises. Ça a été très utile pour optimiser la chaufferie de mon immeuble :slight_smile: Celui qui gère les chaudières a adoré d’avoir les données sans passer des heures la nuit dans la chaufferie connecté directement au PLC :smiley:

Il y a désormais le zoom dans l’historique d’HA, donc c’est peut-être moins utile pour moi aujourd’hui.

1 « J'aime »

Merci pour ton intervention.
Non, je n’ai pas réussi car comme souvent, une réponse implique d’autres questionnements de ma part.

  1. Quel est le langage utilisé par cette custom carte ?
  2. Quel langage est utilisé pour les cartes classiques ?

J’ai essayé d’utiliser des instructions d’une carte pour les mettre dans une autre avec l’éditeur de code, mais j’ai systématiquement des messages d’erreur ?

Mon objectif est maintenant d’afficher une valeur modifiée avec un calcul préalable.

J’aimerais afficher ma consommation quotidienne en kw/h divisée par la différence de température entre intérieur et extérieur.
Ratio = Pu consommée par jour / (T° int - T° ext).

C’est ce genre de graphique ?

Oui, mais en divisant la puissance/jours par la température chauffée.

Whaou, j’ai du mal à lire et comprendre ton graphique.
Que sont les histogrammes bleus en haut ?
Le nombre de jours à X°
La courbe verte est une moyenne ?
L’abscisse est notée température ext ,mais quant la température ext augmente, l’Elec en kwh/j augmente aussi ?

Sacré graph !

Les histogrammes situés en haut et à gauche de la carte comptabilisent les jours où la température moyenne (arrondie) était de 1°C, 2°C, 3°C, etc., ainsi que le nombre de jours où la consommation électrique correspondante a été enregistrée. Ces histogrammes couvrent les 365 derniers jours.
Chaque point sur le graphique représente une journée. L’axe horizontal (X) indique la température moyenne de cette journée, et l’axe vertical (Y) correspond à la consommation électrique enregistrée le même jour.
La ligne droite tracée sur le graphique représente la relation théorique entre la température moyenne et la consommation électrique, basée sur des calculs statistiques.

Le code de cette carte est plus haut dans la conversation.

pour l’axe verticale correspondant à la conso, c’est quelle type de sensor? une valeure journaliere, le total kwh sur une année…? De type total_increasing…?
Si tu pouvais partager ton code, car celui cité en exemple est issu pour pas de valeur en anglais ou hollandais.

J’utilise un Compteur de services publics qui ce réinitialise tous les jours qui prend comme entrée mon lixee.
Ainsi, je garde le max par jour.
voici le code :

type: custom:plotly-graph
entities:
  - entity: sensor.interieur_exterieur_temperature
    statistic: mean
    period: day
    time_offset: "-1d"
    fn: $fn ({ ys, vars }) => vars.temperature = ys
  - entity: sensor.conso_jour
    statistic: state
    period: day
    unit_of_measurement: kWh
    name: Elec
    internal: true
    filters:
      - map_x: x > 10
      - filter: i>0
      - map_y_numbers: y * 1
    fn: $fn ({ ys, vars }) => vars.oil = ys
  - entity: ""
    x: $fn ({ vars }) => vars.temperature
    "y": $fn ({ vars }) => vars.oil
    mode: markers
    name: points
    marker:
      color: rgb(102,0,0)
      size: 3
      opacity: 0.4
    type: scatter
  - entity: ""
    line:
      shape: linear
      color: blue
    filters:
      - fn: |
          ({ys, xs, vars}) => {
            return {xs: vars.temperature, ys: vars.oil};
          }
      - trendline
  - entity: ""
    line:
      color: green
    filters:
      - fn: |
          ({vars}) => {
            const xs = vars.temperature;
            const ys = vars.oil;
            const pairs = xs.map((x, i) => [x,ys[i]])
              .filter( ([x,y]) => Number.isFinite(x) && Number.isFinite(y)) // unavailables in the x axis break trendlines
              .sort((a,b)=>a[0]-b[0]); // the trendline filter expects the x axis to be sorted
            const r = {
              xs: pairs.map(([x,y])=>x),
              ys: pairs.map(([x,y])=>y),
            };
            console.log(r);
            return r;
          }
      - trendline
      - store_var: trend
    x: >-
      $fn ({ vars }) => vars.trend.xs.map(x=>+x) // the trendline made dates out
      of the x axis
    "y": >-
      $fn ({ vars }) => vars.trend.ys // and since this is a raw_plotly_config,
      we need to set x and y ourselves
  - entity: ""
    x: $fn ({ vars }) => vars.temperature
    "y": $fn ({ vars }) => vars.oil
    name: density
    ncontours: 40
    colorscale: YlGnBu
    nbinsx: 40
    nbinsy: 40
    reversescale: true
    showscale: false
    line:
      color: lightgray
    type: histogram2dcontour
  - entity: ""
    x: $fn ({ vars }) => vars.temperature
    name: x density
    texttemplate: "%{x:0.0f}°C"
    marker:
      color: "rgb(40\t57\t143\t)"
    yaxis: y2
    opacity: 1
    type: histogram
  - entity: ""
    x: undefined
    "y": $fn ({ vars }) => vars.oil
    name: y density
    texttemplate: "%{y:0.0f}kWh"
    marker:
      color: "rgb(40\t57\t143\t)"
    xaxis: x2
    type: histogram
hours_to_show: 8760
title: >-
  $fn({getFromConfig})=>`Conso - Last ${getFromConfig('hours_to_show')/24}
  jours`
raw_plotly_config: true
layout:
  margin:
    t: 20
    l: 70
    r: 20
    b: 70
  height: 600
  bargap: 0.1
  showlegend: false
  xaxis:
    title:
      text: Temperature ext (°C)
    autorange: true
    domain:
      - 0
      - 0.85
    showgrid: false
    zeroline: false
  yaxis:
    title:
      text: Elec (kWh / Jour)
    domain:
      - 0
      - 0.85
    showgrid: false
    zeroline: false
  xaxis2:
    domain:
      - 0.85
      - 1
    showgrid: false
    zeroline: false
  yaxis2:
    domain:
      - 0.85
      - 1
    showgrid: false
    zeroline: false

Merci pour tes explications.
Je suis très intéressé par le source, je vais essayer.

« Chaque point sur le graphique représente une journée. L’axe horizontal (X) indique la température moyenne de cette journée, et l’axe vertical (Y) correspond à la consommation électrique enregistrée le même jour. »

Je ne comprends pas bien cette partie.
Prenons 2 exemples :
à 2.5° la coànso est de 0 kw/h/J
à 18°, la conso est de 60 kw/h/J sur la courbe de moyennes vertes.

Il me semble qu’il y ai une erreur, l’axe Y devrait etre inversé, car un utilise + dekw/h pour chauffer quand il fait froid.

Qu’en penses-tu ?

Oui, le problème est que lorsque j’ai changé de fournisseur d’énergie, j’ai perdu l’historique de ma conso… J’ai plus de point en température que de point conso. Cela reviendra d’ici 6 mois lorsque j’aurai 365 jours d’historique de nouveau pour la conso.
C’est pour cela que je passe par un compteur externe maintenant…
Si je prends la courbe des 3 mois, elle est dans le bon sens.

J’ai avancé sur mon graphe. À présent, j’ai 2 courbes (temp ext et puissance pac) qui se superposent quand il n’y a pas de soleil.
Les jours de soleils, ma pac consomme 1 kw / h (toutes les heures) de moins.
J’essaie donc de trouver un capteur public (type weather.ma_ville).
Quelqu’un sait si ça existe ?
Par avance merci.