Removidas essas referências no availability
.
Se quiseres ajuda coloca online que vou contribuindo
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 é
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.
-
O que é o SAJ no template? não consigo perceber a correspondência com o que está na fórmula da LuzBoa
-
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) }}
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
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) }}
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:
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.
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. 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.
@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"
Estive a testar e está OK. Apenas tive que corrigir a variável “Perdas” para 0.1604.
Obrigado. Vou corrigir também
Obrigado, já acrescentei ao wiki.
pelo screenshot não dá para perceber… tem que incluir a escala.