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.
- Intégration HACS : configuration par une boîte de dialogue, entités propres, présente dans le catalogue HACS par défaut
- Paquet YAML : capteur REST et capteurs template à copier-coller, fonctionne aussi sans HACS
- sans clé API, un test habituel couvre 48 heures ; avec clé API, jusqu’à 120 heures – identique pour les deux voies
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.
packages/ et c’est terminé. Pas besoin de HACS, contrôle total de la configuration YAML : un bon choix si vous gérez déjà votre configuration Home Assistant avec Git.
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é.
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.
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.
- Dans HACS, recherchez « Energy Price Forecast EU » et téléchargez l’intégration, puis redémarrez Home Assistant.
- 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.
- 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.
- Remplacez les trois
sensor.CHANGE_MEpar 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.
is_cheapest_window_now et les minutes restantes.À quoi ressemble le résultat
Comment intégrer le paquet
- Téléchargez le fichier de paquet et enregistrez-le sous
/config/packages/energypriceforecast.yaml. - Si les packages ne sont pas encore activés, complétez
configuration.yamlavec ce bloc. - Rechargez Home Assistant ou redémarrez-le une fois.
- 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_api | Ré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_price | Prix 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_intensity | Valeur de CO2 actuelle du créneau en cours. | Déplacement de charge orienté CO2. |
binary_sensor.epf_cheapest_price_window_active | on, 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_minutes | Durée restante du meilleur créneau de prix en cours. | Estimer combien de temps un consommateur peut encore fonctionner. |
sensor.epf_next_full_price_window | Le 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_horizon | Horizon 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.
hours=48. Vous obtenez ainsi l’horizon de test simple, prévu pour être public sans clé supplémentaire.hours=120 soit 5 jours.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=fr&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_price | Valeur de prix actuelle du créneau en cours. | État actuel direct pour la logique de prix. |
flat.current_co2_g_kwh | Valeur de CO2 actuelle du créneau en cours. | État actuel direct pour la logique CO2. |
flat.is_cheapest_window_now | Indique si le meilleur créneau de prix est déjà actif. | Plus important qu’une simple heure de début. |
flat.cheapest_window_remaining_minutes | Durée restante du meilleur créneau de prix en cours. | Utile pour les décisions de durée de marche. |
price.next_full_window.start | Prochain 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_hours | Ce que le serveur autorise pour cet accès. | Transparence nette sur les limites. |
meta.used_horizon_hours | Ce 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_price | Prix 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_source | Libellé 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_kwh | Intensité 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.current | Objet avec start, end, value, unit et source pour le créneau prix courant. | Dashboards et logique plus précise. |
price.cheapest_window_next_horizon | Bloc 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.current | Objet avec valeur CO2 actuelle et fenêtre temporelle associée. | Affichage CO2 sans parser flat. |
co2.greenest_window_next_horizon | Bloc structuré du créneau le plus vert. | Charge ou chauffage optimisés CO2. |
combined.best_window_next_horizon | Bloc de recommandation combiné avec prix, CO2 et score. | Une seule décision "best now" sans score personnalisé. |
source.price | Mé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.co2 | Métadonnées sur la source CO2. | Debug et traçabilité. |
hourly-forecast est plus adapté.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.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.
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.