# Home Assistant package for EnergyPriceForecast # 1. Save this file as /config/packages/energypriceforecast.yaml # 2. If packages are not enabled yet, add this to configuration.yaml: # homeassistant: # packages: !include_dir_named packages # 3. Reload Home Assistant or restart once. # # Optional API key test phase: # - Uncomment the Authorization header below. # - Insert your API key. # - Increase hours=48 to hours=120 in the resource URL. rest: - resource: "https://api.energypriceforecast.eu/api/v1/home-assistant/summary?country=de&hours=48&window_hours=4" scan_interval: 1800 timeout: 30 headers: Accept: "application/json" # Authorization: "Bearer DEIN_API_KEY" sensor: - name: "EnergyPriceForecast API" unique_id: "energypriceforecast_api" value_template: "{{ value_json.generated_at | default('', true) }}" json_attributes: - country - timezone - request - meta - flat - price - co2 - combined - source template: - sensor: - name: "EPF aktueller Preis" unique_id: "epf_current_price" icon: "mdi:currency-eur" availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" unit_of_measurement: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('current_price_unit', 'EUR/kWh') if flat is mapping else 'EUR/kWh' }} state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('current_price') if flat is mapping else none }} - name: "EPF aktuelle CO2 Intensitaet" unique_id: "epf_current_co2_intensity" icon: "mdi:leaf" availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" unit_of_measurement: "gCO2/kWh" state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('current_co2_g_kwh') if flat is mapping else none }} - name: "EPF guenstigstes Fenster Start" unique_id: "epf_cheapest_window_start" icon: "mdi:clock-start" device_class: timestamp availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('cheapest_window_start') if flat is mapping else none }} - name: "EPF guenstigstes Fenster Ende" unique_id: "epf_cheapest_window_end" icon: "mdi:clock-end" device_class: timestamp availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('cheapest_window_end') if flat is mapping else none }} - name: "EPF gruenstes Fenster Start" unique_id: "epf_greenest_window_start" icon: "mdi:clock-start" device_class: timestamp availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('greenest_window_start') if flat is mapping else none }} - name: "EPF naechstes volles Preisfenster" unique_id: "epf_next_full_price_window_start" icon: "mdi:calendar-clock" device_class: timestamp availability: "{{ state_attr('sensor.energypriceforecast_api', 'price') is mapping }}" state: > {% set price = state_attr('sensor.energypriceforecast_api', 'price') %} {% set next_window = price.get('next_full_window') if price is mapping else none %} {{ next_window.get('start') if next_window is mapping else none }} - name: "EPF Restminuten guenstigstes Preisfenster" unique_id: "epf_cheapest_window_remaining_minutes" icon: "mdi:timer-outline" unit_of_measurement: "min" availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('cheapest_window_remaining_minutes') if flat is mapping else none }} - name: "EPF API Key Status" unique_id: "epf_api_key_state" icon: "mdi:key-variant" availability: "{{ state_attr('sensor.energypriceforecast_api', 'meta') is mapping }}" state: > {% set meta = state_attr('sensor.energypriceforecast_api', 'meta') %} {{ meta.get('api_key_state', 'missing') if meta is mapping else 'missing' }} - name: "EPF erlaubter Horizont" unique_id: "epf_allowed_horizon_hours" icon: "mdi:arrow-expand-horizontal" unit_of_measurement: "h" availability: "{{ state_attr('sensor.energypriceforecast_api', 'meta') is mapping }}" state: > {% set meta = state_attr('sensor.energypriceforecast_api', 'meta') %} {{ meta.get('allowed_horizon_hours') if meta is mapping else none }} - name: "EPF genutzter Horizont" unique_id: "epf_used_horizon_hours" icon: "mdi:timeline-clock" unit_of_measurement: "h" availability: "{{ state_attr('sensor.energypriceforecast_api', 'meta') is mapping }}" state: > {% set meta = state_attr('sensor.energypriceforecast_api', 'meta') %} {{ meta.get('used_horizon_hours') if meta is mapping else none }} - binary_sensor: - name: "EPF guenstigstes Preisfenster aktiv" unique_id: "epf_cheapest_window_active" icon: "mdi:flash" availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('is_cheapest_window_now', false) if flat is mapping else false }} - name: "EPF gruenstes Fenster aktiv" unique_id: "epf_greenest_window_active" icon: "mdi:leaf-circle" availability: "{{ state_attr('sensor.energypriceforecast_api', 'flat') is mapping }}" state: > {% set flat = state_attr('sensor.energypriceforecast_api', 'flat') %} {{ flat.get('is_greenest_window_now', false) if flat is mapping else false }}