SolarOptimizer : optimisez votre consommation solaire

C’est l’application Enphase qui donne ça.

Ahhhh ok, tant pis.
Je m’échine à reproduire ça avec HA
Mais c’est pas simple :sweat_smile:

J’ai fais qqe-chose qui ressemble avec Plottly:

type: custom:plotly-graph
entities:
  - entity: sensor.envoy_122307065303_current_power_consumption_l1
    name: Conso L1
    unit_of_measurement: kW
    yaxis: y1
    line:
      color: rgba(3, 73, 252, 1)
  - entity: sensor.envoy_122307065303_current_power_consumption_l2
    name: Conso L2
    unit_of_measurement: kW
    yaxis: y1
    line:
      color: rgba(3, 161, 252, 1)
  - entity: sensor.envoy_122307065303_current_power_consumption_l3
    name: Conso L3
    unit_of_measurement: kW
    yaxis: y1
    line:
      color: rgba(3, 211, 252, 1)
  - entity: sensor.envoy_122307065303_current_power_consumption
    name: Total conso
    unit_of_measurement: kW
    yaxis: y1
    fill: tozeroy
    fillcolor: rgba(3, 74, 255, 0.2)
    line:
      color: rgba(3, 74, 255, 0.1)
  - entity: sensor.envoy_122307065303_current_power_production_l1
    name: Product L1
    unit_of_measurement: kW
    yaxis: y1
    line:
      color: rgba(252, 115, 3, 1)
    filters:
      - multiply: -1
  - entity: sensor.envoy_122307065303_current_power_production_l2
    name: Product L2
    unit_of_measurement: kW
    yaxis: y1
    line:
      color: rgba(252, 161, 3, 1)
    filters:
      - multiply: -1
  - entity: sensor.envoy_122307065303_current_power_production_l3
    name: Product L3
    unit_of_measurement: kW
    yaxis: y1
    line:
      color: rgba(252, 194, 3, 1)
    filters:
      - multiply: -1
  - entity: sensor.envoy_122307065303_current_power_production
    name: Total product
    unit_of_measurement: kW
    yaxis: y1
    fill: tozeroy
    fillcolor: rgba(252, 65, 3, 0.2)
    line:
      color: rgba(252, 65, 3, 0.1)
    filters:
      - multiply: -1
  - entity: sensor.envoy_122307065303_current_net_power_consumption
    name: Net power conso
    yaxis: y1
    unit_of_measurement: kW
    line:
      color: rgba(92, 235, 52, 1)
  - entity: sensor.energy_enphase_current_battery
    name: Energie batterie
    yaxis: y2
    line:
      color: rgba(194, 63, 242, 1)
    filters:
      - multiply: 0.001
    unit_of_measurement: kWh
  - entity: sensor.power_enphase_net_charge_batterie
    name: Total batterie
    unit_of_measurement: kW
    yaxis: y1
    fill: tozeroy
    fillcolor: rgba(201, 73, 230, 0.2)
    line:
      color: rgba(201, 73, 230, 0.1)
layout:
  margin:
    r: 50
  legend:
    x: 0
    "y": 1.2
    groupclick: togglegroup
    title:
      side: top right
  yaxis:
    visible: true
    position: 0
  yaxis2:
    visible: true
    fixedrange: true
    range:
      - 0
      - 3.5
  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
config:
  scrollZoom: true
hours_to_show: 24
refresh_interval: 10
title: Phases
height: 800

A adapter bien sur (je suis en triphasé donc j’ai aussi un détail par phase)

Ca donne qqe-chose comme ça:

EDIT: ou ça qui est encore plus proche

type: custom:config-template-card
entities:
  - input_select.apex_span
variables:
  span: states['input_select.apex_span'].state
  selectionSpan: |
    span => {
      switch (span) {
        case '1h':
          return '1h';
        case '1d':
          return '4h';
        case '1w':
          return '1d';
        case '4w':
          return '1w';
        case '15w':
          return '4w';
        case '52w':
          return '4w';
      }
    }
  groupBy: |
    span => {
      switch (span) {
        case '1h':
          return '1m';
        case '1d':
          return '30m';
        case '1w':
          return '1h';
        case '4w':
          return '4h';
        case '15w':
          return '1d';
        case '52w':
          return '1w';
      }
    }
card:
  type: custom:apexcharts-card
  header:
    show: false
    title: Optimisation Photovoltaïque
    show_states: false
    colorize_states: false
  yaxis:
    - id: left
      show: true
  series:
    - entity: sensor.total_puissance_consommee_instantanee_w
      type: column
      yaxis_id: left
      stroke_width: 1
      opacity: 1
      fill_raw: last
      show:
        extremas: true
        in_brush: false
      group_by:
        func: avg
        duration: ${groupBy(span)}
    - entity: sensor.total_puissance_produite_instantanee_w
      type: area
      yaxis_id: left
      stroke_width: 1
      opacity: 0.3
      fill_raw: last
      show:
        extremas: true
        in_brush: true
      group_by:
        func: avg
        duration: ${groupBy(span)}
    - entity: sensor.total_puissance_importee_instantanee_w
      type: column
      yaxis_id: left
      stroke_width: 1
      opacity: 1
      fill_raw: last
      show:
        extremas: true
      group_by:
        func: avg
        duration: ${groupBy(span)}
      color: darkgray
    - entity: sensor.total_puissance_exportee_instantanee_w
      type: column
      yaxis_id: left
      stroke_width: 1
      opacity: 1
      fill_raw: last
      show:
        extremas: true
      group_by:
        func: avg
        duration: ${groupBy(span)}
      invert: true
      color: gray
  graph_span: ${span}
  all_series_config:
    type: column

qui donne ça (avec changement d’échelle en bas)

Nickel merci.
J’ai également avancé avec apexcharts-card & card-mod.
J’obtiens ceci:


et voici le code:

type: custom:apexcharts-card
experimental:
  hidden_by_default: true
now:
  show: true
  label: ""
  color: red
yaxis:
  - id: value
    apex_config:
      tickAmount: 7
      forceNiceScale: true
      decimalsInFloat: 1
  - id: Conso1
    show: false
apex_config:
  chart:
    stacked: true
    height: 400
    width: 600
    offsetY: -10
    offsetX: -10
    redrawOnParentResize: true
    parentHeightOffset: 0
  legend:
    show: false
  xaxis:
    labels:
      format: HH
      style:
        fontSize: 11px
  fill:
    type: gradient
    gradient:
      type: vertical
      shadeIntensity: 0
      inverseColors: false
      opacityFrom: 0.9
      opacityTo: 0.7
      stops:
        - 10
span:
  offset: +0h
graph_span: 24h
update_interval: 30s
header:
  show: false
  show_states: true
  colorize_states: true
series:
  - entity: sensor.ecu_current_power
    show:
      hidden_by_default: false
    name: Solar now
    color: "#ffc166"
    type: column
    yaxis_id: value
    unit: W
    group_by:
      func: last
      duration: 10m
  - entity: sensor.puissance_consome_neg
    show:
      hidden_by_default: false
    name: Conso totale
    color: "#9c75da"
    type: column
    yaxis_id: value
    unit: W
    group_by:
      func: last
      duration: 10m
card_mod:
  style: |
    ha-card {
      height: 400px !important;
      width: 600px !important;
    }

C’est pas encore pile poil ce que je veux mais ca progresse.

Là c’est le graph de la journée d’hier, mais on vois bien que ton intégration fait un super taf, malgré les variations dues à la journée trèèèèès nuageuses que nous avons eu en gironde.

1 « J'aime »

Bonjour jean Marc,
Merci pour ce retour. Cela veut dire que je passe uniquement via l’interface GUI ? (c’est ce que j’avais fait au début mais sans succès aussi). Entre temps, il y a eu des mises à jour Home Assistant et de Solar optimizer.
Je vais tout virer et ré-installer proprement avec la dernière version.

1 « J'aime »

Rebonjour Jean-Marc,

Suite à une re-install et reconf via GUI, j’ai pu valider mes paramètres de conf SO pour ma TESLA (et mon Chauffe eau). Y’a plus qu’à attendre que j’ai besoin de recharger mon véhicule pour vérifier que cela fonctionne bien.

Quelques question supplémentaires :

Sur le template d’utilisabilité, j’ai ajouté la condition " is_state(‹ input_select.charge_mode ›, ‹ Solaire ›)" comme dans l’exemple.

→ Est-ce que cette condition est propre à Solar Optimizer (du genre un calcul de delta entre ma production et ma conso basée sur les sensors renseignés lors de la configuratioon de SO) ou est-ce un sensor qu’il faut créer (si on a pas) ou renseigner le sensor de la conso nette ?

→ Aussi, dans le prix d’achat de l’énergie, considérant les heures pleines et les heures creuses, je ne peux pas renseigner directement le compteur public jour (celui OOTB fournis avec HA), je ne peux renseigner que l’un de mes compteurs dérivés (HC ou HP) de celui ci que j’ai créés. Le problème (je suppose) est que de ce fait, il ne va me prendre en compte qu’un seul tarif (?).

→ Enfin, mais ça pour plus tard, je suis chez un fournisseur d’énergie qui me « Stocke » de manière virtuelle mon énergie produite en surplus et me la restitue (sur la facture) sur ma consommation réseau moyennant les taxes d’acheminement RTE par kW/h restitués. Çà peut s’apparenter a un « Pourcentage de taxe de revente » du genre je vends mon électricité non consommée au même prix que je l’achète, diminuée de ce pourcentage.
Pour faire cela, j’ai renseigné le « Prix de vente de l’énergie » avec mon compteur HC car ils me restituent HC en priorité (voir quasi tout le temps puisque je chargeait essentiellement la nuit mon véhicule) mais cela pourrait changer maintenant que je vais tirer directement sur la prod solaire.
Bref, savoir si à l’avenir tu va coder cette spécificité ou pas (?)

Voilà, je débute sur HA et SO, j’espère avoir été assez compréhensible dans mes explications :slightly_smiling_face:

D’avance, merci

Salut à tous
Je viens de constater que ma grosse charge (CE de 3kW) c’est mis en route en même temps que mon autre chauffe eau de 1kW alors que ma production ne dépasse pas les 2kW et sachant que j’ai environ 180W de talon de conso
Voici les attributs de mon chauffe eau de 3kW


is_enabled: true
is_active: true
is_waiting: true
is_usable: false
can_change_power: false
current_power: 3000
requested_power: 3000
duration_sec: 60
duration_power_sec: 60
power_min: -1
power_max: 3000
next_date_available: "2025-05-13T08:10:01.418650+02:00"
next_date_available_power: "2025-05-11T18:24:01.488623+02:00"
battery_soc_threshold: 0
battery_soc: 0
device_name: ECS cave CHPT
friendly_name: Solar Optimizer-ECS cave CHPT Active

Je confirme n’avoir aucun autre source de déclenchement de cette charge d’active à ce moment là !

Merci d’avance
PS @Jean-Marc_Collin, je ne crois pas avoir eu de réponse à mon précédent message

Hello all,

Pour info, j’ai publié ce week-end une version beta qui prend en compte une gestion de priorité. Si ca vous intéresse, je l’ai testé avec succès et elle est dispo ici: Release 3.5.0.beta1 · jmcollin78/solar_optimizer · GitHub

(vous devez forcer la version sous HACS pour installer une version beta).

Lisez bien le README pour comprendre comment ça marche et à votre dispo si ce n’est pas clair.

2 « J'aime »

Hello @Benj31 ,

C’est un input_select que j’ai créé spécialement pour mon cas d’usage ou je veux choisir le mode de charge de la voiture (manuel ou solaire). Ca fait doublon avec l’entité enable qui autorise SO a gérer la charge maintenant. Tu peux l’oublier je pense.

Non il faut que le input_number que tu donnes à SO soit à jour par rapport aux prix HC / HP et ce sera prix en compte dynamiquement. Mais entre nous, en HC (la nuit) y a pas de soleil donc c’est pas très utile. Ca peut l’être quand on aura des HC la journée, je crois que c’est en réflexion chez EDF.

Je n’ai rien besoin de faire à partir du moment ou ton input_number qui donne le prix est à jour avec le vrai prix.

1 « J'aime »

Hello @yoyouri,

Je ne peux juste avec ces infos voir ce qui s’est passé. La config à l’air bonne. Il me faut des courbes : production / conso et équipements activés par SO (total power) pour y voir une incohérence.

Si tu parles de la priorisation, j’ai répondu juste au-dessus par la beta qui prend en compte la priorisation. Je veux bien ton retour sur son bon fonctionnement. Lis bien le README_fr pour comprendre comment ça marche.

Merci je vais tester ça, ça m’interresse bcp !!!

PS, il y a un $ de trop dans cette ligne : ($la)

  1. la priorisation d’équipements par rapport à d’autres peut dégrader l’optimisation de la consommation de la production solaire. Il est donc normal d’avoir du surplus non consommé si vous utilisez les priorités. Vous pouvez régler le dégré de prise en charge de $la priorité en réglant le poids de la priorité
1 « J'aime »

Re,
il faut forcement la version HA 2025.5.1 ( qui est sorti il y a 4 jours ) ?

Salut @Jean-Marc_Collin
Voici les courbes demandés pour la période où j’ai constaté ce problème



La courbe de conso depuis le réseau pendant ce problème


Et là la courbe de puissance élec globale (si sup à zéro c’est que ça vient du réseau

N’y a t-il pas une vérif sur un laps de temps de la puissance disponible avant l’enclenchement d’une charge !

Super, je test ça dans les prochains jours

Encore merci

Oui elle est faite pour un système à jour. Tu peux y aller sans risque sur ha2025.05

Bonjour,

Voici un autre résultat de Solar Optimizer, ayant un système completement different, je ne peut pas avoir le type de graphique:
J’ai un mppt fonctionnant en courent continue , une batterie en courent continue et un onduleur Central transformant le courent continue en AC.
Ayant pas de contrat de revente, je n’exporte pas mes excédent solaire sur le réseau et donc si ma batterie est plein et que je manque de consommateur, ça arrête ou ça baisse ma production solaire de manière automatique

Sur le graph du haut :

  • en jaune, ce que j’ai produit
  • en bleu, ce que j’aurais put produire (simulation de production via un pyranometre qui me donne une valeur en W/m²)

Sur le graph du bas, les 5 équipements utiliser/activer par Solar Optimizer (a partir de 12h30-13h, eau chaude et il a fait suffisamment chaud dans la maison , donc plus de consommateur activer par Solar Optimizer)

Bonne journée

Excellent ! Merci pour le partage.

Y a des fournisseurs d’électricité qui font batterie virtuelle pour ton suprlus, une fois ta batterie chargée. Je ne sais pas si tu as regardé.

Salut @Jean-Marc_Collin
J’ai constaté encore aujourd’hui des surconsommation hors surplus et aussi bien le matin que le soir



Demain travaillant de mon domicile je pourrais constater potentiellement plus de chose ayant la possibilité d’être devant mon HA

Par contre a tu un idée de ce que tu aurais besoin de plus pour comprendre cette consommation hors surplus ?

Merci d’avance

En complément ce que je viens de constater en direct





J’ai un gros problème car les charges se mettent en route alors qu’il n’y a pas la puissance de disponible
Que faut-il faire ?
Tout désinstaller et réinstaller !

Activer le mode débug de l’extension puis partagé les logs

1 « J'aime »

Ce ne serait pas lié au temps minimum de fonctionnement de tes appareils qui fait que les consommateurs se « chevauchent » ?
C’est une supposition, ce cas est peut être déjà géré dans SO

1 « J'aime »