Langue

Home Assistant · prix de l’électricité et CO2

Deux voies équivalentes pour obtenir les données de prix et de CO2 dans Home Assistant

Energy Price Forecast EU propose deux voies entièrement prises en charge vers Home Assistant : une intégration HACS native avec configuration graphique, ou un paquet YAML classique avec capteur REST. Les deux utilisent la même API et fournissent les valeurs actuelles, les états en cours et les créneaux les plus importants.

Quelle voie vous convient ?

Les deux voies interrogent le même point d’accès summary et fournissent les mêmes données. La différence tient à la mise en place et à l’entretien.

Dépôt open source de l’intégration HACS : github.com/BackupBaTTerY/energypriceforecast-home-assistant. Les deux voies peuvent aussi fonctionner en parallèle, tant que vous ne créez pas deux fois les mêmes identifiants d’entité.

Démarrer gratuitement, planifier plus loin si besoin

L’accès Home Assistant reste utilisable sans clé API et fournit en général jusqu’à 48 heures. Si vous souhaitez planifier de gros consommateurs sur plusieurs jours, vous pouvez essayer Private Pro avec jusqu’à 120 heures gratuitement pendant 14 jours.

Remarque importante sur l’API

Les nouvelles installations devraient utiliser https://api.energypriceforecast.eu/api/v1/... comme adresse. L’API summary ne renvoie pas une série de prix complète, mais un bloc compact pour l’automatisation avec le prix actuel, la valeur de CO2 actuelle, le meilleur créneau et des informations sur votre accès.

Comment configurer l’intégration HACS

L’intégration figure dans le catalogue HACS par défaut : vous n’avez plus rien à ajouter à la main.

  1. Dans HACS, recherchez « Energy Price Forecast EU » et téléchargez l’intégration, puis redémarrez Home Assistant.
  2. Paramètres → Appareils et services → Ajouter une intégration, recherchez « Energy Price Forecast EU » et choisissez votre marché ainsi que les réglages optionnels.

Le bouton en haut (« Ajouter l’intégration HACS ») ouvre directement l’intégration dans HACS si HACS est déjà installé.

Comparer la prévision aux prix publiés

La courbe verte montre les prix day-ahead publiés, l’orange la prévision actuelle et la bleue en pointillés la première prévision enregistrée. Cette dernière reste visible lorsque les prix officiels arrivent.

  1. Mettez Energy Price Forecast EU à jour vers 1.12.0 ou plus récent dans HACS, puis redémarrez Home Assistant. Installez aussi ApexCharts Card 2.1.0 ou plus récent via HACS.
  2. Remplacez les trois sensor.CHANGE_ME par la même entité de série de prix dans Outils de développement → États. Pour le prix total configuré, utilisez l’entité de prix de détail actuel. Collez le YAML dans Tableau de bord → Modifier → Ajouter une carte → Manuel.

L’enregistrement commence après la mise à jour et résiste aux redémarrages. Les valeurs restent disponibles jusqu’à la fin du jour de marché concerné, sans reconstituer les anciennes prévisions. captured_at est l’heure de réception dans Home Assistant, pas celle du modèle. Ce n’est ni une mesure de qualité à échéance fixe ni une archive illimitée.

Adaptez l’unité de l’axe à celle du capteur, par exemple EUR/kWh et non ct/kWh. Un prix total calculé ne garantit pas votre facture. Sans clé, l’horizon reste limité à 48 heures ; pour 120 heures au maximum, utilisez l’accès approprié et graph_span: 6d. Cette carte concerne l’intégration HACS, pas l’exemple REST-summary ci-dessous, et n’ajoute aucun appel API.

YAML prêt à copier
type: custom:apexcharts-card
header:
  show: true
  title: Energy Price Forecast EU
graph_span: 3d
span:
  start: day
now:
  show: true
  label: Maintenant
yaxis:
  - id: price
    decimals: 3
    apex_config:
      title:
        text: EUR/kWh
all_series_config:
  yaxis_id: price
  type: line
  curve: stepline
  extend_to: false
  stroke_width: 2
  float_precision: 4
  show:
    legend_value: false
series:
  # Replace ALL three placeholders with the SAME price or retail sensor.
  - entity: sensor.CHANGE_ME
    name: Officiel (day-ahead)
    color: "#43a047"
    data_generator: |
      const raw = [...(entity.attributes.raw_today ?? []),
                   ...(entity.attributes.raw_tomorrow ?? [])];
      const slots = raw.map(e => ({
        start: Date.parse(e.start), end: Date.parse(e.end), value: e.value
      })).filter(e => Number.isFinite(e.start) && Number.isFinite(e.end)
        && e.end > e.start && typeof e.value === 'number' && Number.isFinite(e.value))
        .sort((a, b) => a.start - b.start);
      const points = [];
      let previousEnd = null;
      for (const slot of slots) {
        if (previousEnd !== null && slot.start > previousEnd) {
          points.push([previousEnd, null], [slot.start - 1, null]);
        }
        points.push([slot.start, slot.value], [slot.end - 1, slot.value]);
        previousEnd = slot.end;
      }
      return points;
  - entity: sensor.CHANGE_ME
    name: Prévision actuelle
    color: "#fb8c00"
    data_generator: |
      const raw = entity.attributes.raw_forecast ?? [];
      const slots = raw.map(e => ({
        start: Date.parse(e.start), end: Date.parse(e.end), value: e.value
      })).filter(e => Number.isFinite(e.start) && Number.isFinite(e.end)
        && e.end > e.start && typeof e.value === 'number' && Number.isFinite(e.value))
        .sort((a, b) => a.start - b.start);
      const points = [];
      let previousEnd = null;
      for (const slot of slots) {
        if (previousEnd !== null && slot.start > previousEnd) {
          points.push([previousEnd, null], [slot.start - 1, null]);
        }
        points.push([slot.start, slot.value], [slot.end - 1, slot.value]);
        previousEnd = slot.end;
      }
      return points;
  - entity: sensor.CHANGE_ME
    name: Prévision enregistrée (première reçue)
    color: "#1e88e5"
    stroke_dash: 5
    data_generator: |
      const raw = entity.attributes.raw_forecast_reference ?? [];
      const slots = raw.map(e => ({
        start: Date.parse(e.start), end: Date.parse(e.end), value: e.value
      })).filter(e => Number.isFinite(e.start) && Number.isFinite(e.end)
        && e.end > e.start && typeof e.value === 'number' && Number.isFinite(e.value))
        .sort((a, b) => a.start - b.start);
      const points = [];
      let previousEnd = null;
      for (const slot of slots) {
        if (previousEnd !== null && slot.start > previousEnd) {
          points.push([previousEnd, null], [slot.start - 1, null]);
        }
        points.push([slot.start, slot.value], [slot.end - 1, slot.value]);
        previousEnd = slot.end;
      }
      return points;
Optionnel : adapter la carte avec une IA
Help me tailor an ApexCharts card for Energy Price Forecast EU. First ask for my exact entity ID, sensor unit, integration version, hourly/quarter-hourly settlement and whether I want market or retail prices. Do not ask for an API key.
From integration 1.12.0, Price forecast series and Current retail price expose:
- raw_today and raw_tomorrow: published day-ahead slots.
- raw_forecast: current forecast slots beyond official coverage.
These lists contain {start, end, value}.
- raw_forecast_reference: {start, end, value, captured_at}; the first forecast received for a then-future slot, saved locally. Later forecasts and official prices never overwrite it.
References accumulate only after updating, survive restarts and are removed after the target market day ends. captured_at is the HA observation time, not model creation.
Use green for official prices, orange for the current forecast and dashed blue for the saved forecast, on the same axis in the sensor's unit. Require ApexCharts Card 2.1.0 or newer. Use each series' data_generator and extend_to: false. Draw start through end, preserve gaps with null, and retain genuine zero/negative prices. Never copy official values into a forecast line. Use only the documented attributes.
Optionally ask about the hourly/weekend plan: its hours attribute contains {start, end, average_value}. Mark those times separately without changing the plan. Return complete YAML for a manual Lovelace card and explain where to paste it. A chart alone does not switch a charger.

Answer in French.

Un résultat en 5 minutes (paquet YAML)

Si vous avez choisi la voie YAML, prenez ces trois fichiers. Le fichier de paquet récupère les données, la carte Lovelace les affiche et l’automatisation d’exemple montre l’usage concret.

Volontairement simpleLe fichier de paquet n’utilise que le point d’accès summary. Ni HACS, ni module complémentaire, ni script Python.
Déjà pensé pour un vrai pilotageCe qui compte ici, ce ne sont pas seulement les heures de début, mais aussi des états comme is_cheapest_window_now et les minutes restantes.
Interrogation respectueuse du serveurL’exemple interroge par défaut toutes les 30 minutes. Pour le day-ahead et la prévision, c’est normalement tout à fait suffisant.

À quoi ressemble le résultat

Aperçu d’une carte Lovelace avec le prix actuel, la valeur de CO2 et les créneaux de prix.
La carte Lovelace affiche directement les entités du fichier de paquet, sans que vous ayez d’abord à construire vos propres tableaux de bord.
Aperçu d’une automatisation Home Assistant simple déclenchée par le créneau de prix le moins cher.
L’automatisation d’exemple démarre volontairement simplement et s’adapte ensuite à une borne de recharge, une pompe à chaleur ou un interrupteur.

Comment intégrer le paquet

  1. Téléchargez le fichier de paquet et enregistrez-le sous /config/packages/energypriceforecast.yaml.
  2. Si les packages ne sont pas encore activés, complétez configuration.yaml avec ce bloc.
  3. Rechargez Home Assistant ou redémarrez-le une fois.
  4. Importez ensuite la carte Lovelace et, si vous le souhaitez, l’automatisation d’exemple.
homeassistant:
  packages: !include_dir_named packages

Vous pouvez ajouter la carte Lovelace à un tableau de bord avec le type de carte Manuel dans la liste. L’automatisation s’importe elle aussi en YAML dans les automatisations, ou sert simplement de modèle.

Quelles entités obtenez-vous ensuite ?

Le fichier de paquet crée une source brute et, à partir d’elle, des entités directement utilisables. On voit ainsi tout de suite si l’API fonctionne correctement, et l’on peut construire ses propres automatisations sans analyser de JSON.

Entité Signification Usage typique
sensor.energypriceforecast_apiRéponse brute du point d’accès summary, y compris flat, price, co2 et meta.Débogage et base pour d’autres templates.
sensor.epf_current_pricePrix actuel du créneau en cours. La source peut être le day-ahead ou la prévision.Borne de recharge, pompe à chaleur ou chauffe-eau pilotés par le prix.
sensor.epf_current_co2_intensityValeur de CO2 actuelle du créneau en cours.Déplacement de charge orienté CO2.
binary_sensor.epf_cheapest_price_window_activeon, lorsque le meilleur créneau de prix calculé est déjà en cours.Décision de marche directe, sans comparer vous-même des heures.
sensor.epf_cheapest_price_window_remaining_minutesDurée restante du meilleur créneau de prix en cours.Estimer combien de temps un consommateur peut encore fonctionner.
sensor.epf_next_full_price_windowLe prochain créneau futur complet pour le prix.Démarrer plus tard ou planifier.
sensor.epf_api_key_statusÉtat de la clé API enregistrée.Voir rapidement si 48 h ou 120 h s’appliquent vraiment.
sensor.epf_allowed_horizonHorizon en heures autorisé côté serveur.Vérifier que votre installation obtient bien la durée souhaitée.

Quelle période l’API fournit-elle exactement ?

Pour Home Assistant, l’essentiel n’est pas seulement l’URL, mais aussi la logique qui se trouve derrière. C’est précisément cela qui doit être transparent.

Sans clé APIL’exemple utilise hours=48. Vous obtenez ainsi l’horizon de test simple, prévu pour être public sans clé supplémentaire.
Avec clé APISi vous placez le jeton Bearer dans l’en-tête, vous pouvez porter l’horizon du paquet jusqu’à hours=120 soit 5 jours.
Résolution des prixLe day-ahead peut être disponible par créneaux de 15 minutes. La prévision au-delà reste horaire. Le summary combine les deux proprement.
Le day-ahead d’abordDès que des prix day-ahead officiels existent, ils sont prioritaires. Les valeurs de prévision ne servent que pour la période restante.
Le CO2 reste horaireLes données de CO2 ne sont pas converties artificiellement en quarts d’heure. Pour le summary, la vue horaire du CO2 suffit en général.
Créneaux déjà calculésL’API ne fournit pas seulement des valeurs brutes, mais déjà le créneau le moins cher, le créneau le plus vert et le prochain créneau futur complet.

Où saisir la clé API et comment allonger l’horizon ?

Les deux se font directement dans le fichier de paquet. Vous n’avez pas besoin d’un second point d’accès : il suffit d’activer l’en-tête Authorization et d’ajuster le nombre d’heures.

rest:
  - resource: "https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=be&hours=120&window_hours=4"
    scan_interval: 1800
    headers:
      Accept: "application/json"
      Authorization: "Bearer YOUR_API_KEY"

Pour savoir si votre clé est réellement utilisée, regardez ensuite sensor.epf_api_key_status, sensor.epf_allowed_horizon et sensor.epf_used_horizon.

Qu’apporte concrètement le point d’accès summary ?

Le chemin summary est conçu exprès pour les automatisations. Il vous épargne beaucoup de logique, car vous n’avez pas à analyser de longues séries horaires pour prendre des décisions simples.

Champ Signification Pourquoi c’est utile
flat.current_priceValeur de prix actuelle du créneau en cours.État actuel direct pour la logique de prix.
flat.current_co2_g_kwhValeur de CO2 actuelle du créneau en cours.État actuel direct pour la logique CO2.
flat.is_cheapest_window_nowIndique si le meilleur créneau de prix est déjà actif.Plus important qu’une simple heure de début.
flat.cheapest_window_remaining_minutesDurée restante du meilleur créneau de prix en cours.Utile pour les décisions de durée de marche.
price.next_full_window.startProchain créneau futur complet pour le prix.Planification lorsque vous voulez volontairement démarrer plus tard.
meta.api_key_stateÉtat de la clé enregistrée.Recherche d’erreurs et phase de test.
meta.allowed_horizon_hoursCe que le serveur autorise pour cet accès.Transparence nette sur les limites.
meta.used_horizon_hoursCe que l’API a réellement fourni.Cette page et le serveur restent ainsi honnêtement alignés.

Référence officielle des champs pour home-assistant/summary

L’endpoint summary reste volontairement compact. Pour beaucoup d’automatisations, le bloc flat suffit. Si tu veux plus de contrôle ou un dashboard plus fin, tu peux aussi utiliser les blocs structurés price, co2, combined et source.

Champ Signification Usage typique
flat.current_pricePrix actuel en EUR/kWh. Pour le créneau en cours, l’API prend automatiquement la meilleure source publique disponible.Capteur prix simple pour automatisations.
flat.current_price_sourceLibellé de la source du prix actuel, par exemple day_ahead.Vérifier si la valeur est déjà officielle ou encore prédictive.
flat.current_co2_g_kwhIntensité CO2 actuelle en gCO2/kWh.Déclenchement piloté par le CO2.
flat.cheapest_window_*Début, fin et moyenne du créneau le moins cher.Recharge EV, boiler, pompe à chaleur.
flat.greenest_window_*Début, fin et moyenne du créneau le moins carboné.Planification orientée CO2.
flat.combined_window_*Créneau de compromis entre prix et CO2.Quand les deux comptent sans pondération maison.
price.currentObjet avec start, end, value, unit et source pour le créneau prix courant.Dashboards et logique plus précise.
price.cheapest_window_next_horizonBloc structuré du créneau le moins cher avec durée et répartition des sources.Quand il faut début, fin et contexte ensemble.
co2.currentObjet avec valeur CO2 actuelle et fenêtre temporelle associée.Affichage CO2 sans parser flat.
co2.greenest_window_next_horizonBloc structuré du créneau le plus vert.Charge ou chauffage optimisés CO2.
combined.best_window_next_horizonBloc de recommandation combiné avec prix, CO2 et score.Une seule décision "best now" sans score personnalisé.
source.priceMétadonnées sur la source prix, y compris document Firestore, provider day-ahead et volume d’entrées disponibles.Debug, monitoring et contrôle qualité.
source.co2Métadonnées sur la source CO2.Debug et traçabilité.
Important sur les champs prixL’endpoint summary ne renvoie pas la série brute complète de toutes les variantes de prix. Pour Home Assistant, il renvoie surtout l’état courant et des créneaux déjà calculés. Pour une série horaire complète, hourly-forecast est plus adapté.
Actuel ne veut pas dire prix historique constatéflat.current_price correspond au prix public exploitable pour le créneau en cours. Il peut provenir du day-ahead officiel ou d’une autre source publique déjà libérée si le marché complet n’est pas encore disponible.
Prix total seulement sur certains marchésL’endpoint public retail-forecast est actuellement prévu seulement pour certains marchés. Pour les autres, la summary reste volontairement sur des valeurs de marché ou de base.

Exemple : ne recharger la voiture que pendant le créneau avantageux

C’est exactement à cela que sert l’automatisation d’exemple. Elle utilise volontairement le booléen binary_sensor.epf_cheapest_price_window_active au lieu de se déclencher seulement à une heure donnée. C’est plus robuste, car le meilleur créneau peut déjà être en cours.

trigger:
  - platform: state
    entity_id: binary_sensor.epf_cheapest_price_window_active
    to: "on"

action:
  - service: persistent_notification.create
    data:
      title: "Cheapest price window active"

Si, au lieu d’une notification, vous voulez démarrer directement une borne de recharge ou un interrupteur, remplacez simplement le service de la dernière étape par votre propre service cible, par exemple switch.turn_on.

Adapter à votre installation avec une IA

Ce prompt aide une IA à construire, à partir du point d’accès summary, une automatisation Home Assistant adaptée. Il ne remplace pas le démarrage simple par copier-coller ci-dessus ; il est prévu pour des consommateurs, des échéances et des règles de sécurité qui vous sont propres.

Protéger la clé API

Ne donnez jamais votre vraie clé API à une IA. Laissez toujours YOUR_API_KEY dans le résultat et ne saisissez la clé que localement dans Home Assistant.

Afficher le prompt à copier
Help me build a safe Home Assistant automation using the Energy Price Forecast EU API.

Read the API contract first:
https://energypriceforecast.eu/openapi/integration-api.json

Use /api/v1/home-assistant/summary and do not invent fields. The API uses official day-ahead prices wherever available and forecast values only for the remaining open horizon.

Before writing YAML, ask me no more than these questions, one at a time:
1. Country or bidding zone?
2. Which load should be controlled and which Home Assistant entity switches it?
3. Power, required runtime and latest completion time?
4. Optimise for price, CO2 or both?
5. Free without a key and up to 48 hours, or Private Pro with up to 120 hours?
6. Do I use packages or configuration.yaml?

Rules for your result:
- Free: hours=48 and no Authorization header.
- Private Pro: hours=120 and header Authorization: Bearer YOUR_API_KEY.
- Never ask me to paste the real key into the chat.
- Handle HTTP errors and check meta.api_key_state and meta.allowed_horizon_hours.
- Briefly explain every API property you use.
- Produce complete, correctly indented YAML and state exactly where it belongs.
- Start with a safe test mode using a notification or input_boolean. Put real load switching in a separate, clearly marked step.
- Define safe behaviour for stale, missing or implausible data. An API error must never switch the load on unexpectedly.
- Finish with a checklist: HTTP 200, sensors populated, allowed horizon correct and test mode triggered correctly.

Ask when information is missing. Do not silently assume entity names, tariffs or electrical limits.

Answer in French.

Base lisible par machine : contrat OpenAPI des points d’accès d’intégration.

Quand summary suffit-il, et quand vous faut-il davantage ?

summary suffit pour la plupart des automatisations Home Assistant

Si vous avez besoin de valeurs actuelles, d’un meilleur créneau et d’états simples, le point d’accès summary est la bonne voie. C’est exactement pour cela que le fichier de paquet est conçu.

Pour vos propres séries de prix ou graphiques, un point d’accès avec la série brute convient mieux

Si vous voulez plus tard construire votre propre logique de score, des graphiques ou des séries temporelles détaillées, le point d’accès summary est volontairement moins détaillé. Un point d’accès de prévision avec la série brute est alors la voie la plus adaptée.

S’agit-il des prix exacts de l’électricité pour les ménages ?

Pas automatiquement. Le summary travaille d’abord avec des prix de marché ou de base. Votre prix exact dépend en plus du réseau, des taxes, des contributions et des marges du fournisseur.

Que faire si aucune valeur n’apparaît après le collage ?

Causes typiques : dossier packages non inclus, erreur d’indentation dans le YAML, Home Assistant non rechargé ou valeur erronée pour country. Les journaux de Home Assistant et les outils de développement le montrent le plus vite.

Quelles zones reçoivent des prix day-ahead publiés ?

Nous ne transmettons les prix day-ahead publiés que là où la source l'autorise. Pour NO1, NO3, NO4, NO5, SE1, SE2, FI, RO, SK, GR, BG et les zones italiennes sauf Nord, les endpoints renvoient donc depuis le 24 octobre 2026 notre prévision pour chaque heure, et les capteurs marquent ces heures comme prévision. Vous obtenez les prix publiés via l'intégration Nord Pool de Home Assistant ; pour SK, GR, BG et l'Italie via une intégration ENTSO-E avec votre propre jeton.

Voir aussi : evcc avec prévision de prix de l’électricité et de CO2.

Pour aller plus loin