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

Removidas essas referências no availability. :+1:

1 Curtiu

Se quiseres ajuda coloca online que vou contribuindo :wink:

boa tarde. estava agora a verificar o template bi horário da LuzBoa e fiquei na dúvida se está tudo correcto.

A fórmula no site da LuzBoa é image
com os valores descritos assim:
Preço (Pp) = Preço de energia ativa a pagar (em €/kWh);
OMIE (OMIEh) = Preço horário médio mensal, no período faturado, no mercado OMIE (em €/kWh);
CGS = Custos de operação e gestão do sistema (valor de 0.0065 €/kWh);
Perdas (Perdas ERSE) = = são as perdas da rede, fixadas pela ERSE - Entidade Reguladora dos Serviços Energéticos
FA = Fator de Adequação 1.02
Kp = 5 - Valor fixo correspondente aos gastos operacionais da Luzboa (em €/MWh)

No template do github está assim:
((PFC*(1+PT))*FA+(CG)+(TEPAi))

sendo o PFC = PMD + Desvios + SAJ
o PMD é o valor diário médio do MIBEL e o TEPAi as TAR

o resto dos valores estão definidos como
MIBEL: “{{ 0 }}”
Desvios: “{{ 0 }}”
SAJ: “{{ 4 }}”
FA: “{{ 1.02 }}”
PT: “{{ 0.1507 }}”
CG: “{{ 5 }}”

As minhas dúvidas prendem-se com dois pontos.

  1. O que é o SAJ no template? não consigo perceber a correspondência com o que está na fórmula da LuzBoa

  2. O CG está como 5, no entanto no site da LuzBoa referem o CGS como 0.0065

Está a escapar-me algo? Se alguém me puder ajudar a perceber, agradeço.

UPDATE:

Estive a refazer o template bi horário da LuzBoa com base nas fórmulas no site, cruzei com os resultados que outras pessoas tiveram em excels que partilharam num grupo de facebook, e estão a bater certo. Fica aqui a minha versão do template revisto e simplificado.

    - unique_id: luzboa_spot_btn_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 FA = state_attr(this.entity_id, 'FA') -%}
        {% set k = state_attr(this.entity_id, 'k') -%}

        {% set TAR = state_attr(this.entity_id, 'TAR') -%}
        
        {% if None in [OMIE, CGS, Perdas, FA, k, TAR] %}
          {{ None }}
        {% else %}
          {{ ((OMIE+CGS)*Perdas*FA+k+TAR) | round(2) }}
        {% endif %}
      attributes:
        friendly_name: "Luzboa SPOT BTN (tarifário bi-horário)"
        formula: (OMIE+CGS)*Perdas*FA+k+TAR
        OMIE: "{{ state_attr('sensor.omie_spot_price_pt', 'today_average') }}"
        CGS: "{{ 6.5 }}"
        Perdas: "{{ 1.1507 }}"
        FA: "{{ 1.02 }}"
        k: "{{ 5 }}"
        TAR_vazio: "{{ -34.9 if now().date().isoformat() < '2024-01-01' else 9.2 }}"
        TAR_fora_vazio: "{{ -0.5 if now().date().isoformat() < '2024-01-01' else 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 FA = state_attr(this.entity_id, 'FA') -%}
          {% 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') -%}
            {% if None in [OMIE, CGS, Perdas, FA, k, TAR] %}
              {% set price = None %}
            {% else %}
              {% 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') -%}
              {% set price=((OMIE+CGS)*Perdas*FA+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 FA = state_attr(this.entity_id, 'FA') -%}
          {% 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') -%}
            {% if None in [OMIE, CGS, Perdas, FA, k, TAR] %}
              {% set price=None %}
            {% else %}
              {% 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') -%}
              {% set price=((OMIE+CGS)*Perdas*FA+k+TAR) | round(2) %}
            {% endif %}
            {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
          {% endfor -%}
          {{ dict(ns.hourly_data) }}
2 Curtiram

Dei conta da integração https://www.home-assistant.io/integrations/opower que pode servir de base a um refactor da integração do OMIE :slight_smile:

Uma das coisas que ela faz é injectar histórico e ter exemplos de como consultar as estatísticas programaticamente (evitando a necessidade de usar SQL)

@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.


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


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