Integração OMIE: preços horários, diários, mecanismo de ajuste

@Joao_Batista as fórmulas da LuzBoa foram contribuição de alguém na altura, não sei dizer muito mais. Obrigado pela actualização, irei reflectir no Wiki.

@dgomes boa dica. Por acaso já tinha espreitado os sensores statistic para ver como é feito o acesso programático a esses dados mas a injecção de estatísticas não tinha imaginado que fosse sequer permitido.
Em todo o caso para as médias acabei por achar que o mais sensato era usar os ficheiros “mensais” do OMIE e calcular as médias no momento, acaba por ser mais simples e mais fiável (as estatísticas às vezes estão em falta).

para quem estiver interessado, estive a fazer o template para o indexado Repsol, actualizado para 2024.

template:
  sensor:
    - unique_id: repsol_spot_price_bihorario
      unit_of_measurement: '€/MWh'
      availability: "{{ has_value('sensor.omie_spot_price_pt') }}"
      state_class: measurement
      state: >
        {% set OMIE = states('sensor.omie_spot_price_pt')|float -%}
        {% set Perdas = 0.15 -%}
        {% set FA = 1.03 -%}
        {% set QTarifa = 14.79 -%}
        {% set TAR_vazio = -34.9 if now().date().isoformat() < '2024-01-01' else 9.2 -%}
        {% set TAR_fora_vazio = -0.5 if now().date().isoformat() < '2024-01-01' else 50.2 -%}
        {% set TAR = TAR_vazio if now().hour < 8 or now().hour > 21 else TAR_fora_vazio -%}
        
        {{ ((OMIE)*(1 + Perdas)*FA + QTarifa + TAR) | round(2) }}
      attributes:
        friendly_name: "Repsol Indexado (tarifário bi-horário)"
        formula: "(OMIE)*(1 + Perdas)*FA + QTarifa + TAR"
        OMIE: "{{ states('sensor.omie_spot_price_pt')|float }}"
        Perdas: "{{ 0.15 | float }}"
        FA: "{{ 1.03 | float }}"
        QTarifa: "{{ 14.79 | float  }}"
        TAR_vazio: "{{ -34.9 if now().date().isoformat() < '2024-01-01' else 9.2 | float }}"
        TAR_fora_vazio: "{{ -0.5 if now().date().isoformat() < '2024-01-01' else 50.2 | float }}"
        today_hours: >
            {% set Perdas = 0.15 -%}
            {% set FA = 1.03 -%}
            {% set QTarifa = 14.79 -%}
            {% set TAR_vazio = -34.9 if now().date().isoformat() < '2024-01-01' else 9.2 -%}
            {% set TAR_fora_vazio = -0.5 if now().date().isoformat() < '2024-01-01' else 50.2 -%}
            
            {% set ns = namespace(hourly_data=[]) %}
            {% for h, OMIE in state_attr('sensor.omie_spot_price_pt', 'today_hours').items() -%}
              {% set TAR = TAR_vazio if h.hour < 8 or h.hour > 21 else TAR_fora_vazio -%}
            
              {% if OMIE == None %}
                {% set price=OMIE %}
              {% else %}
                {% set price=((OMIE)*(1 + Perdas)*FA + QTarifa + TAR) | round(2) %}
              {% endif %}
              {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
            {% endfor -%}
            {{ dict(ns.hourly_data) }}
        tomorrow_hours: >
            {% set Perdas = 0.15 -%}
            {% set FA = 1.03 -%}
            {% set QTarifa = 14.79 -%}
            {% set TAR_vazio = -34.9 if now().date().isoformat() < '2023-12-31' else 9.2 -%}
            {% set TAR_fora_vazio = -0.5 if now().date().isoformat() < '2023-12-31' else 50.2 -%}

            {% set ns = namespace(hourly_data=[]) %}
            {% for h, OMIE in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours').items() -%}
              {% set TAR = TAR_vazio if h.hour < 8 or h.hour > 21 else TAR_fora_vazio -%}

              {% if OMIE == None %}
                {% set price=OMIE %}
              {% else %}
                {% set price=((OMIE)*(1 + Perdas)*FA + QTarifa + TAR) | round(2) %}
              {% endif %}
              {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
            {% endfor -%}
            {{ dict(ns.hourly_data) }}
1 Curtiu

Obrigado, tomei a liberdade de acrescentar este (e o simples) ao Wiki do hass_omie.

Nunca analisei as fórmulas da Luzboa muito a fundo porque não sou cliente. No entanto, as fórmulas parece que foram introduzidas por volta de Abril de 2023, ver Integração OMIE: preços horários, diários, mecanismo de ajuste - #62 por SchattenMann.

O que por sua vez é consistente com esta publicação do Tiago Felícia de Junho de 2023:
Tiago Felícia  Facebook 2024-01-06 18-12-36

Será que a Luzboa não criou uma nova fórmula para novos contratos, @Joao_Batista? Seria bom percebermos bem o que está aqui em causa para se poder reflectir no Wiki.

Acabei de fazer investigação histórica e é isso. No segundo semestre de 2023 a luzboa actualizou alguns dos fatores e numa comunicação que enviaram aos clientes na altura referiram que tiveram que actualizar isso.

Assim sendo, o template que actualizei é o correto para a segunda metade de 2023 e 2024.

1 Curtiu

Certíssimo. Já actualizei o Wiki, obrigado.

Bom dia a todos.
Sou cliente LUZBOA, e ainda não consegui perceber quais as alterações, a partir de 1 de janeiro de 2024, na parte das tarifas de acesso às redes. Já se sabe os valores de acesso, por exemplo para bi-horário (vazio e fora de vazio), em kWh? Nâo consigo achar informação segura, ou pelo menos fácil de perceber… Obrigado!

Claro que sim e há muito tempo. :slight_smile: A fonte mais segura é sempre um ficheiro XLS no site da ERSE.

No entanto, partilho novamente uma publicação de Facebook do Tiago Felícia onde está tudo resumido de uma forma muito sintética.

Tarifas Energia Portugal  Facebook 2024-01-07 12-30-10

1 Curtiu

@luuuis ,

Tentei fazer um template para a Ibelectra, tarifário Familia: Solução FAMÍLIA, com base no mail recebido: Mail

- unique_id: ibelectra_familia_bihorario

   unit_of_measurement: '€/MWh'

   availability: "{{ state_attr('sensor.omie_spot_price_pt', 'today_average') != None }}"

   state_class: measurement

   state: >

     {% set OMIE = state_attr('sensor.omie_spot_price_pt', 'today_average') -%}

     {% set CGS = state_attr(this.entity_id, 'CGS') -%}

     {% set Perdas = state_attr(this.entity_id, 'Perdas') -%}

     {% set k = state_attr(this.entity_id, 'k') -%}

     {% set TAR = state_attr(this.entity_id, 'TAR') -%}

       

     {% if None in [OMIE, CGS, Perdas, k, TAR] %}

       {{ None }}

     {% else %}

       {{ ((OMIE+CGS)*(1+Perdas)+k+TAR) | round(2) }}

     {% endif %}

   attributes:

     friendly_name: "Ibelectra Solução Familia (tarifário bi-horário)"

     formula: (OMIE+CGS)*(1+Perdas)+k+TAR

     OMIE: "{{ state_attr('sensor.omie_spot_price_pt', 'today_average') }}"

     CGS: "{{ 7 }}"

     Perdas: "{{ 1.1604 }}"

     k: "{{ 3.5 }}"

     TAR_vazio: "{{ 9.2 }}"

     TAR_fora_vazio: "{{ 50.2 }}"

     TAR: "{{ state_attr(this.entity_id, 'TAR_vazio') if now().hour < 8 or now().hour > 21 else state_attr(this.entity_id, 'TAR_fora_vazio') }}"

     today_hours: >

       {% set OMIE = state_attr('sensor.omie_spot_price_pt', 'today_average') -%}

       {% set CGS = state_attr(this.entity_id, 'CGS') -%}

       {% set Perdas = state_attr(this.entity_id, 'Perdas') -%}

       {% set k = state_attr(this.entity_id, 'k') -%}

         

       {% set ns = namespace(hourly_data=[]) %}

       {% for h in state_attr('sensor.omie_spot_price_pt', 'today_hours') -%}

         {% set TAR = state_attr(this.entity_id, 'TAR_vazio') if h.hour < 8 or h.hour > 21 else state_attr(this.entity_id, 'TAR_fora_vazio') -%}

         {% if None in [OMIE, CGS, Perdas, k, TAR] %}

           {% set price = None %}

         {% else %}

           {% set price=((OMIE+CGS)*(1+Perdas)+k+TAR) | round(2) %}

         {% endif %}

         {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}

       {% endfor -%}

       {{ dict(ns.hourly_data) }}

     tomorrow_hours: >

       {% set OMIE = state_attr('sensor.omie_spot_price_pt', 'tomorrow_average') -%}

       {% set CGS = state_attr(this.entity_id, 'CGS') -%}

       {% set Perdas = state_attr(this.entity_id, 'Perdas') -%}

       {% set k = state_attr(this.entity_id, 'k') -%}

       {% set ns = namespace(hourly_data=[]) %}

       {% for h in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours') -%}

         {% set TAR = state_attr(this.entity_id, 'TAR_vazio') if h.hour < 8 or h.hour > 21 else state_attr(this.entity_id, 'TAR_fora_vazio') -%}

         {% if None in [OMIE, CGS, Perdas, k, TAR] %}

           {% set price=None %}

         {% else %}

           {% set price=((OMIE+CGS)*(1+Perdas)+k+TAR) | round(2) %}

         {% endif %}

         {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}

       {% endfor -%}

       {{ dict(ns.hourly_data) }}

Não sei se está ok. Podes confirmar?

Muito boa e útil integração, parabéns!
Deixo esta dica de sensores para obter a hora de custo mínimo para automatizar cargas pois não o consegui encontrar no fórum.
(mínimo do dia / mínimo entre determinadas horas)

  - unique_id: time_electric_today_min
    device_class: timestamp
    state: >
      {% set today_min = state_attr('sensor.omie_spot_price_pt', 'today_hours').values()|map('float', 999)|min -%}
      {% for h, PM in state_attr('sensor.omie_spot_price_pt', 'today_hours').items() -%}
        {% if PM == today_min %}
          {{ h }}
          {% break %}
        {% endif %}
      {% endfor -%}
    attributes:
      friendly_name: "Time Electricity Today Minimum Value"

  - unique_id: time_electric_today_0_7_min
    device_class: timestamp
    state: >
      {% set today_0_7_min = (state_attr('sensor.omie_spot_price_pt', 'today_hours').values()|list)[:8]|min -%}
      {% for h, PM in (state_attr('sensor.omie_spot_price_pt', 'today_hours').items()|list)[:8] -%}
        {% if PM == today_0_7_min %}
          {{ h }}
          {% break %}
        {% endif %}
      {% endfor -%}
    attributes:
      friendly_name: "Time Electricity Today 0-7 Minimum Value"

  - unique_id: time_electric_today_11_18_min
    device_class: timestamp
    state: >
      {% set today_11_18_min = (state_attr('sensor.omie_spot_price_pt', 'today_hours').values()|list)[12:19]|min -%}
      {% for h, PM in (state_attr('sensor.omie_spot_price_pt', 'today_hours').items()|list)[12:19] -%}
        {% if PM == today_11_18_min %}
          {{ h }}
          {% break %}
        {% endif %}
      {% endfor -%}
    attributes:
      friendly_name: "Time Electricity Today 11-18 Minimum Value"

4 Curtiram

Olá @Nuno_Manuel_Costa

Estive a testar e está OK. Apenas tive que corrigir a variável “Perdas” para 0.1604.

1 Curtiu

Obrigado. Vou corrigir também

Obrigado, já acrescentei ao wiki.

1 Curtiu

Boas,
Estes valores estarão corretos? Parecem-me demasiado altos:

pelo screenshot não dá para perceber… tem que incluir a escala.

Boa tarde.

Para quem tem contrato com a Coopérnico:

A parcela FP (Perfil de Perdas) dos Tarifários da Coopérnico foi alterado.
Usam agora 0.16 em vez dos 0.15, ainda que seja um valor indicativo. Penso que antes era um valor fixo.

Tem razão.
Aqui vai:

Esta madrugada os valores desceram até cerca de 20€/MWh para Ibelectra bi horário. Se o seu é Simples, é provável que esteja correcto, os preços da electricidade no mercado grossista estiveram bastante elevados há uns dias atrás.

Tenho bi-horário
Fiquei desconfiado destes valores.

como está a representar esses valores? A mim a Ibelectra aparece-me à hora, no seu gráfico não parece ser o caso…


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade