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

Olá @Paulo1975!

Antes de mais dizer que existe um componente para isso que se chama EMHASS Addon. Não é a coisa mais simples do mundo de configurar mas vale a pena para qualquer cenário minimamente complexo.

Para usar directamente com as automações do HA infelizmente é menos linear do que devia ser. Mas podes, por exemplo, criar este sensor que te calcula a “melhor” hora, a segunda melhor e por aí fora.

    - unique_id: electricidade_melhor_hora_hoje
      availability: "{{ has_value('sensor.omie_spot_price_pt') }}"
      state: "{{ state_attr(this.entity_id, 'melhor_0') }}"
      attributes:
        melhor_0: "{{ state_attr(this.entity_id, 'horas')[0] }}"
        melhor_1: "{{ state_attr(this.entity_id, 'horas')[1] }}"
        melhor_2: "{{ state_attr(this.entity_id, 'horas')[2] }}"
        horas: >
          {%
            set hs = state_attr('sensor.omie_spot_price_pt', 'today_hours').items()
                   | selectattr("1", "float")
                   | sort(attribute="1")
                   | map(attribute='0')
                   | map(attribute='hour')
                   | list
          %}
          {{ hs }}

Depois podes usar com esse sensor um trigger conforme explicado neste outro tópico, qualquer coisa como isto.

trigger:
  - platform: template
    value_template: "{{ now().hour in state_attr('sensor.pvpc', 'next_best_at') }}"
action:
  # cenas aqui

Nota: para fazer esse tipo de automação o mais correcto seria usar o sensor de um tarifário. No entanto, para quem usa tarifário simples deve ir dar ao mesmo (já no bi-horário, não).

1 Curtiu

É exatamente isto que eu procurava, assim é possível programar o consumo nas horas mais baratas.
Muito obrigado.
Um abraço

Não tenho acompanhado, mas vou ver ser revejo isto em breve.
As tantas já alguém aqui actualizou o template.

Boas.

Pelo que vejo, está integração obtém o valor da omie.

Eu vou passar de tarifa fixa para indexada. Tenho os sensores de consumo ( bi-horario) a multiplicar pelo valor fixo + potência.

Como sugerem que faça a transição para um valor por kw que não é fixo? Ponho o HA a fazer contas de hora em hora e somar ao valor acumulado da hora anterior?

Boa tarde,

Estou com um problema na integração que não consigo compreender desde a última atualização do HA Core 2024.3.0.

Também tenho a integração OMIE com a última atualização.

O estado do sensor.omie_spot_price_pt não atualiza conforme a hora, nem a integração vai buscar os valores para o atributo “tomorrow_hours”.

Nos logs não encontro nada referente a este problema.

O que até agora consegui perceber foi:

1- Se recarregar a integração, o estado do sensor.omie_spot_price_pt fica correto, de acordo com a atual hora e vai buscar os valores para o atributo “tomorrow_hours”. No entanto, nunca volta a atualizar o estado nem atributos.
2- Em Ferramentas do Programador → Templates acontece o seguinte:

Mas:

Parece não estar a assumir a lista como concatenada.

Não sei o que posso apresentar mais para explicar o problema.

Agradeço desde já a vossa atenção
AL

Boa noite, também estou com o mesmo problema ao atualizar para a nova versão, os sensores da integração OMIE não estão a atualizar automaticamente, apenas o fazem ao forçar um “reload”…

O fix temporário será criar uma automação a correr de hora em hora para chamar o serviço “homeassistant.reload_config_entry” com a entity “sensor.omie_spot_price_pt”. Ver issue " Error setting up entry OMIE for sensor.

Obrigado @Daniel_G.
Não me apercebi do issue.

Já lá vão 4 integrações a fazer reload automatizado :grimacing:

AL

Quem quer correr o HA 2024.3.0 deve instalar previamente o https://github.com/luuuis/hass_omie/releases/tag/v1.0.5 pois foi introduzida uma incompatibilidade nessa versão do HA.

2 Curtiram

Quais são as 4 integrações?

Renault
met.no
Magic Home
com triggers de x minutos unavailable

Não sei se já foi identificado por alguém, ou se só acontece a mim.

Com a release v1.0.5 a integração atualiza sem a automatização e tudo funciona bem, mas quando reinicio o HA tenho de ir fazer reload manual à integração ou os sensores ficam com estado “unknown”.

Não é nada que comprometa a utilização da integração, só quero transmitir o que a mim acontece.

EDIT: Ignorem pf! Aconteceu 2 vezes, mas não acontece mais.

Olá João, tenho o repsol indexado e gostava de acompanhar. Sou um bocado ignorante nesta matéria. Como se usa este sensor/template? Qual a ferramenta a usar?

Obrigado desde já.
Cumps,
Pedro Rosário

Boa tarde.

Presumo que já tenhas o HomeAssistant e a Integração OMIE instalados e configurados.

Para usar este template, o que eu fiz do meu lado foi copiar o texto do template em questão, no seu caso Repsol Indexado, estou a assumir, Simples (https://github.com/luuuis/hass_omie/wiki/Repsol-Leve-sem-Mais-simples), para o ficheiro configuration.yaml que existe na raíz do homeassistant.

Fica algo parecido com isto (neste caso com LuzBoa)…

depois de gravar o ficheiro e reiniciar o homeassistant, deverá ter este sensor disponível, e aí só tem que o consumir como preferir.

Se quiser mostrar um gráfico, sugiro o que o @luuuis sugere na página de git (apexcharts-card). Nesse caso, terá que instalar esse card custom, e depois num dashboard do homeassistant adicionar o card, e na configuração do card, colar algo como o seguinte, substituindo pelo sensor correto no seu caso, Repsol:

type: custom:apexcharts-card
update_interval: 30m
now:
  show: true
span:
  start: day
graph_span: 1d
all_series_config:
  stroke_width: 1
  type: line
  curve: stepline
  group_by:
    func: avg
    duration: 1h
  show:
    extremas: true
    legend_value: false
  data_generator: >
    return Object.entries(entity.attributes.today_hours).map(([dateString,
    price]) => [ new Date(dateString), price ])
series:
  - entity: sensor.template_ibelectra_familia_bihorario
    name: Ibelectra
yaxis:
  - id: price
    align_to: 10
1 Curtiu

Mais alguém está a ter estes erros nos logs?

2024-03-20 02:00:00.271 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'None' has no attribute 'items' when rendering '{% set CG = 0.20 -%} {% set PM = state_attr('sensor.omie_spot_price_pt', 'today_average') -%} {% set ns = namespace(hourly_data=[]) %} {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'today_hours').items() -%}
  {% if PM == None or MAJ == None %}
    {% set price=PM %}
  {% else %}
    {% set price=(PM*(1-CG)) | round(2) %}
  {% endif %}
  {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
{% endfor -%} {{ dict(ns.hourly_data) }}'
2024-03-20 02:00:00.271 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'None' has no attribute 'items' when rendering '{% set CG = 0.20 -%} {% set PM = state_attr('sensor.omie_spot_price_pt', 'tomorrow_average') -%} {% set ns = namespace(hourly_data=[]) %} {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours').items() -%}
  {% if PM == None or MAJ == None %}
    {% set price=PM %}
  {% else %}
    {% set price=(PM*(1-CG)) | round(2) %}
  {% endif %}
  {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
{% endfor -%} {{ dict(ns.hourly_data) }}'
2024-03-20 02:00:00.271 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'') while processing template 'Template<template=({% set CG = 0.20 -%} {% set PM = state_attr('sensor.omie_spot_price_pt', 'today_average') -%} {{ (PM*(1-CG)) | round(2) }}) renders=120>' for attribute '_attr_native_value' in entity 'sensor.template_luzboa_excedente_indexado'
2024-03-20 02:00:00.271 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('UndefinedError: 'None' has no attribute 'items'') while processing template 'Template<template=({% set CG = 0.20 -%} {% set PM = state_attr('sensor.omie_spot_price_pt', 'today_average') -%} {% set ns = namespace(hourly_data=[]) %} {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'today_hours').items() -%}
  {% if PM == None or MAJ == None %}
    {% set price=PM %}
  {% else %}
    {% set price=(PM*(1-CG)) | round(2) %}
  {% endif %}
  {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
{% endfor -%} {{ dict(ns.hourly_data) }}) renders=120>' for attribute 'today_hours' in entity 'sensor.template_luzboa_excedente_indexado'
2024-03-20 02:00:00.271 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('UndefinedError: 'None' has no attribute 'items'') while processing template 'Template<template=({% set CG = 0.20 -%} {% set PM = state_attr('sensor.omie_spot_price_pt', 'tomorrow_average') -%} {% set ns = namespace(hourly_data=[]) %} {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours').items() -%}
  {% if PM == None or MAJ == None %}
    {% set price=PM %}
  {% else %}
    {% set price=(PM*(1-CG)) | round(2) %}
  {% endif %}
  {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
{% endfor -%} {{ dict(ns.hourly_data) }}) renders=120>' for attribute 'tomorrow_hours' in entity 'sensor.template_luzboa_excedente_indexado'
2024-03-20 02:00:00.292 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'None' has no attribute 'items' when rendering '{% set CG = 0.20 -%} {% set PM = state_attr('sensor.omie_spot_price_pt', 'today_average') -%} {% set ns = namespace(hourly_data=[]) %} {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'today_hours').items() -%}
  {% if PM == None or MAJ == None %}
    {% set price=PM %}
  {% else %}
    {% set price=(PM*(1-CG)) | round(2) %}
  {% endif %}
  {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
{% endfor -%} {{ dict(ns.hourly_data) }}'
2024-03-20 02:00:00.293 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'None' has no attribute 'items' when rendering '{% set CG = 0.20 -%} {% set PM = state_attr('sensor.omie_spot_price_pt', 'tomorrow_average') -%} {% set ns = namespace(hourly_data=[]) %} {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours').items() -%}
  {% if PM == None or MAJ == None %}
    {% set price=PM %}
  {% else %}
    {% set price=(PM*(1-CG)) | round(2) %}
  {% endif %}
  {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
{% endfor -%} {{ dict(ns.hourly_data) }}'

do meu lado, tudo sem erros… fizeste update para as últimas versões dos componentes e do HA?

Tudo usando as últimas versões, a não ser que tenha algum erro durante o copy & paste, isto é o que tenho configurado e por mais que tenha comparado, side-by-side nao consigo encontrar anda de errado.

- sensor:
    - unique_id: ibelectra_familia_simples
      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 [CGS, Perdas, k, TAR] %}
          {{ None }}
        {% else %}
          {{ ((OMIE+CGS)*(1+Perdas)+k+TAR) | round(2) }}
        {% endif %}
      attributes:
        friendly_name: "Ibelectra Solução Familia (tarifário simples)"
        formula: (OMIE+CGS)*(1+Perdas)+k+TAR
        OMIE: "{{ state_attr('sensor.omie_spot_price_pt', 'today_average') }}"
        CGS: "{{ 7 }}"
        Perdas: "{{ 0.1604 }}"
        k: "{{ 3.5 }}"
        TAR: "{{ 36.50 }}"
        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 TAR = state_attr(this.entity_id, 'TAR') -%}
          {% set ns = namespace(hourly_data=[]) %}
          {% for h in state_attr('sensor.omie_spot_price_pt', 'today_hours') -%}
            {% 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 TAR = state_attr(this.entity_id, 'TAR') -%}
          {% set ns = namespace(hourly_data=[]) %}
          {% for h in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours') -%}
            {% 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) }}
- sensor:
    - unique_id: luzboa_spot_btn_simples
      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 simples)"
        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: "{{ 36.50 }}"
        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 TAR = state_attr(this.entity_id, 'TAR') -%}
          {% 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 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 TAR = state_attr(this.entity_id, 'TAR') -%}
          {% 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 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) }}
- sensor:
    - unique_id: luzboa_excedente_indexado
      unit_of_measurement: "€/MWh"
      state_class: measurement
      state: >
        {% set CG = 0.20 -%}
        {% set PM = state_attr('sensor.omie_spot_price_pt', 'today_average') -%}
        {{ (PM*(1-CG)) | round(2) }}
      attributes:
        friendly_name: "Luzboa excedente (indexado)"
        formula: "PM * (1 - CG)"
        PM: "{{ state_attr('sensor.omie_spot_price_pt', 'today_average') }}"
        CG: "{{ 0.20 | float }}"
        today_hours: >
          {% set CG = 0.20 -%}
          {% set PM = state_attr('sensor.omie_spot_price_pt', 'today_average') -%}
          {% set ns = namespace(hourly_data=[]) %}
          {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'today_hours').items() -%}
            {% if PM == None or MAJ == None %}
              {% set price=PM %}
            {% else %}
              {% set price=(PM*(1-CG)) | round(2) %}
            {% endif %}
            {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
          {% endfor -%}
          {{ dict(ns.hourly_data) }}
        tomorrow_hours: >
          {% set CG = 0.20 -%}
          {% set PM = state_attr('sensor.omie_spot_price_pt', 'tomorrow_average') -%}
          {% set ns = namespace(hourly_data=[]) %}
          {% for h, _ in state_attr('sensor.omie_spot_price_pt', 'tomorrow_hours').items() -%}
            {% if PM == None or MAJ == None %}
              {% set price=PM %}
            {% else %}
              {% set price=(PM*(1-CG)) | round(2) %}
            {% endif %}
            {% set ns.hourly_data=ns.hourly_data + [(h.isoformat(), price)] %}
          {% endfor -%}
          {{ dict(ns.hourly_data) }}

Boas.

Segundo a Luzboa, na tarfia bihorária, eles calculam dois preços médios mensais: um do periodo das 22-8 (vazio) e o outro 8-22 (não vazio), de cada dia.
Alguém tem o cálculo destes dois preços médios mensais?
Já tenho o utility meter disponivel que dá os kws de vazio e não-vazio; bastaria multiplicar por esses dois preços, julgo eu.

Mas a Luzboa faz média mensal, e no caso do bi-horario, duas médias.
Como obter essa média para ir multiplicando pelos kws consumidos?

não faz. ou está ok com ter um valor estimado no dashboard de Energia do HomeAssistant, ou terá que construir o seu contador, somando os consumos do período que quer contar, e ter outro contador para o preço, tendo em consideração a média dos últimos 30 dias. Com estes dois, é uma questão de multiplicar o consumo pelo preço médio do período e tem uma aproximação mais realista (faltam sempre taxas e taxinhas)

Continuo a ter estes erros e não estou mesmo a conseguir perceber o porquê, mais alguém que tenha notado nos vossos logs este cenário?


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


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