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

Sim, tenho isto:

sensor:
    - unique_id: luzboa_spot_price_simples
      unit_of_measurement: 'EUR/kWh'
      state_class: measurement
      state: >
        {% set PMD = state_attr('sensor.omie_spot_price_pt', 'day_average')|float -%}
        {% set MIBEL = state_attr('sensor.omie_adjustment_price_pt', 'day_average')|float -%}
        {% set Desvios = 0 -%}
        {% set SAJ = 0.004 -%}
        {% set PFC = ((PMD+MIBEL)/1000) + Desvios + SAJ -%}
        {% set ER = 1 -%}
        {% set FA = 1.02 -%}
        {% set PT = 0.1507 -%}
        {% set CG = 0.005 -%}
        {% set TEPAi = -0.09580 -%}
        
        {{( (ER*PFC*(1+PT))*FA+(ER*CG)+(ER*TEPAi) ) | round(4) }}
      attributes:
        friendly_name: "Luzboa €/kWh em simples"
        formula: "(ER*PFC*(1+PT))*FA+(ER*CG)+)ER*TEPAi)"
        PMD: state_attr('sensor.omie_spot_price_pt', 'day_average')|float -%}
        MIBEL: state_attr('sensor.omie_adjustment_price_pt', 'day_average')|float -%}
        Desvios: {{ 0 | float }}
        SAJ: {{ 0.004 | float }}
        FA: {{ 1.02 | float  }}
        PT: {{ 0.1507 | float }}
        CG: {{ 0.005 | float }}
        TEPAi: {{ -0.09580 | float }}
    - unique_id: luzboa_spot_price_bihorario
      unit_of_measurement: 'EUR/kWh'
      state_class: measurement
      state: >
        {% set PMD = state_attr('sensor.omie_spot_price_pt', 'day_average')|float -%}
        {% set MIBEL = state_attr('sensor.omie_adjustment_price_pt', 'day_average')|float -%}
        {% set Desvios = 0 -%}
        {% set SAJ = 0.004 -%}
        {% set PFC = ((PMD+MIBEL)/1000) + Desvios + SAJ -%}
        {% set ER = 1 -%}
        {% set FA = 1.02 -%}
        {% set PT = 0.1507 -%}
        {% set CG = 0.005 -%}

        {% set TAR_vazio = -118.5/1000 -%}
        {% set TAR_fora_vazio = -84.2/1000 -%}
        {% set TEPAi = TAR_vazio if now().hour < 8 or now().hour > 21 else TAR_fora_vazio -%}
                
        {{( (ER*PFC*(1+PT))*FA+(ER*CG)+(ER*TEPAi) ) | round(4) }}
      attributes:
        friendly_name: "Luzboa €/kWh em Bihorario"
        formula: "(ER*PFC*(1+PT))*FA+(ER*CG)+)ER*TEPAi)"
        PH: {{ states('sensor.omie_spot_price_pt') | float }}
        MIBEL: {{ states('sensor.omie_adjustment_price_pt') | float }}
        Desvios: {{ 0 | float }}
        SAJ: {{ 0.004 | float }}
        FA: {{ 1.02 | float  }}
        PT: {{ 0.1507 | float }}
        CG: {{ 0.005 | float }}
        TEPAi: >
          {% set TAR_vazio = -118.5/1000 -%}
          {% set TAR_fora_vazio = -84.2/1000 -%}
          {% set TEPAi = TAR_vazio if now().hour < 8 or now().hour > 21 else TAR_fora_vazio -%}
          {{ TEPAi }}

No entanto, não estou certo se a formula está ou não bem aplicada.

No caso do bi-horario tenho a certeza que está mal. Assumo que eles fazem a média do calor horário dentro de cada período para obter o vazio/fora. Portanto eu preciso de fazer a média do valor horário entre as 22-8 (no caso de bi-horario diario) mas não estou bem a ver como fazer isso já que “o dia muda”. Sugestões?

Estou como tu, contratei uma empresa para vir instalar paineis solares no meu prédio pra meu uso exclusivo, e pretendo mudar para um mercado indexado, uma vez que vou tendo tempo para ir analisando o mercado, e saber quando terei que saltar fora.
Contudo, acho que me vou manter com uma tarifa simples e nao bi-horária porque acho que não faz sentido para mim, uma vez que os equipamentos mais gulosos vao funcionar no horario em que os paineis vão produzir.
Mas, não sei se está a faltar alguma coisa na minha linha de pensamento, as vezes poderei estar errado.
Estou com ideias, de criar um evento no discord um dia destes para falar por voz e ficar registado para consulta posterior no youtube, algo sobre este tema, que considero deveras importante para a comunidade, seria interessante tu @luuuis participares e falares um pouco do trabalho que tens desenvolvido para a comunidade no qual te agradecemos e muito. Caso haja realmente interesse , em marcarmos um dia/noite falem comigo e farei acontecer.

Na minha opinião, se concentrares os consumos nos horários certos (entre as 10h e as 18h, mais coisa menos coisa, depende dos dias), compensa os 60€. Com a ajuda desta excelente integração, o meu saldo dos últimos 30 dias está a negativo. Pessoalmente também gosto que os valores das perdas e CGS sejam fixos, permite ter um melhor controlo.

Por outro lado, na próxima assembleia da Coopérnico, dia 22, uma das propostas em cima da mesa é um cooperante poder indicar até 3 NIFs de pessoas singulares, os quais podem aderir a fornecimento de energia elétrica sem se tornarem cooperantes. Pelo que, arranjas um ou dois amigos e dividem o custo das participações, se de facto os 60€ te estão a impedir de aderir. É só uma ideia…

2 Curtiram

Boa, vamos aguardar por novos desenvolvimentos.

No meu caso, com carro electrico, o meu consumo é uns 80% fora do vazio

Lá está. Tirando o início da manhã e o final da tarde, os preços têm estado mais baixos durante o dia, nas horas “cheias”. Eu cá tenho recebido por carregar o meu carro :metal:

1 Curtiu

Acho que o correcto para a média diária seria fazer a média do vazio do dia, que compreende os períodos entre as 00:00-07:59 e as 22:00-23:59. Os períodos do dia seguinte entram na média do dia seguinte.

Mas também estou a assumir, o melhor seria não assumir nada e esclarecer com a Luzboa.

O que interessa mais não é o consumo absoluto mas o que se compra à rede, o que depende da produção dos painéis. Eu também comecei no simples e só mais tarde após ter tido oportunidade de analisar um ano de consumos.

Autorizaste o acesso da Coopérnico ao diagrama de cargas para que eles consigam cobrar o valor horário do kWh?

1 Curtiu

Recentemente aderi à Coopérnico no tarifário horário indexado versão Bi-Horária.
Para tentar ter um gráfico com os valores da Coopérnico no horário português, fiz este template.

      - unique_id: omie_horario_portugues
        unit_of_measurement: "EUR/MWh"
        state_class: measurement
        state: >
          {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [now().hour+1]|float }}
        attributes:
          friendly_name: "OMIE com correção fuso horário"
          day_hours: >
            [
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [1] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [2] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [3] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [4] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [5] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [6] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [7] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [8] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [9] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [10] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [11] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [12] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [13] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [14] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [15] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [16] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [17] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [18] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [19] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [20] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [21] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [22] }},
            {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [23] }},
            {% if now().hour <= 13 %}
              {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [23] }},
            {% else %} {{ state_attr('sensor.omie_spot_price_pt_tomorrow', 'day_hours') [0] }}
            {% endif %}
            ]

Os gráficos ficam muito diferentes:
Sem correção horária:
image

E o mesmo no horário Português:
image

Mas parece-me que está correto: A TAR aplica-se no horário português ao valor do OMIE no horário espanhol…

Sim, autorizei logo no primeiro dia. A primeira fatura virá nos próximos dias, aí vou confirmar se está tudo correto na minha lógica.

Na verdade, já pensei em desligar os meus painéis em determinados dias. Estão-me a tirar consumo à rede…
Com a recente flutuação dos preços ao longo do dia, os preços têm estado mais baixos durante o dia, por isso não vejo vantagem no bi-horário, ou está-me a falhar alguma coisa?

Sim, concordo. No seu devido tempo tenciono corrigir a integração com o valor correcto consoante o horário CET.

Desse modo quem estiver na Luzboa ou outro comercializador que faça uma interpretação incorrecta dos preços horários terá que se amanhar com truques como esse template sensor (ou outro que publico no Wiki).

Humm, eu gostava de acreditar que esta integração ajuda na descarbonização da rede eléctrica ao incentivar o desvio de consumos para períodos de menor preço / maior produção através de renováveis.

E não que, pelo contrário, conduzisse ao desligar de produção de fontes de energia renováveis. :slight_smile:

E podes acreditar. Principalmente estando, como dizes, o menor preço diretamente relacionado com a maior produção através de renováveis.
Ainda não tive coragem de os desligar devido a essa mesma razão.
Também podemos aderir ao tarifário GO (com Garantias de Origem 100% renováveis). Mais 0,015€/KWh (já com os 15%de perdas) e a menor ou maior quantidade de energia que vamos consumir da rede, é também proveniente de origens renováveis…

Como é que tem funcionado esse sensor? Estava agora a mexer com isto e esta parte está-me a fazer impressão:

{% if now().hour <= 13 %}
  {{ state_attr('sensor.omie_spot_price_pt', 'day_hours') [23] }},
{% else %}
  {{ state_attr('sensor.omie_spot_price_pt_tomorrow', 'day_hours') [0] }}
{% endif %}

Não é pela implementação em si, que consigo fazer, mas a confusão que isto vai causar aos utilizadores. Por exemplo:

  • o preço que vigora entre as 23 e 00 só se sabe depois das 13 de cada dia, o que dificulta o planeamento,
  • pela mesma razão a média do dia só se sabe depois das 13 de cada dia,
  • a média do dia não vai bater certo com o que mostra o OMIE, que mostra a média para o mercado português durante as horas do dia espanhol,
  • se pelo contrário continuar a expor a média OMIE, não vai bater certo com a média real calculada a partir dos valores horários.

Isto é quase motivo para um gajo começar a arrancar cabelos… :dizzy_face:

Ufa, essas questões são mesmo chatas de conciliar! No meu caso, que é horário, não uso a média do dia, pelo que a solução funciona bem! Ao repetir o valor da hora anterior, no gráfico vai ficar muito aproximada e às 13h já mostra o valor correto.

Em relação às médias, a Coopérnico usa a média diária baseada na hora espanhola ou portuguesa? Se for a portuguesa, a média tem mesmo de ser diferente da do site. Se for a espanhola, se calhar não seria de calcular a hora no HASS, mas antes ir buscar o valor diretamente ao site…

O sensor OMIE funciona muito bem, e eu adaptei conforme as sugestões no Wiki. E se houvesse essa adaptação apenas nos códigos do Wiki, e cada um escolhia o código consoante a sua operadora? Ou então, os sensores já embutidos na integração, e cada um usava o sensor correto?

Mas é um quebra-cabeças!!

De arrancar os cabelos…de facto!

Eu cá não tinha ido tão longe como o João e só criei template para o state. Para o gráfico fiz uma espécie de offset setHours(hour, -60, 0, 0)) e a última hora aparecia sempre igual à penúltima. Obrigado João!

Para um tarifário que utilize o preço médio diário, nunca vai ser possível durante as primeiras 13 horas do dia saber a que preço se está a trabalhar. A não ser que a operadora utilize para média o valor do site, apesar de trabalhar com o horário espanhol (o que não me faz muito sentido).

Para o utilizador, talvez seja mais simples ter entidades distintas e com a média real calculada a partir dos valores horários. Ainda que, independentemente de ser com entidades ou sensores colocados no wiki, o utilizador deve saber que não vai bater certo com o OMIE.

Ou então, para evitares uns cabelos brancos precoces, atualizas todas as entidades e mudas o nome da integração para: Integração “OMIE/Coopérnico: Tarifário Horário” :joy:

1 Curtiu

Alguem dispostos a olhar para a logica deste template sff?

Teoricamente vai retornar os valores praticados pela LuzBoa em Simples e Bihorario:

sensor:
    - unique_id: luzboa_spot_price_simples
      unit_of_measurement: 'EUR/kWh'
      state_class: measurement
      state: >
        {% set PMD = state_attr('sensor.omie_spot_price_pt', 'day_average')|float -%}
        {% set MIBEL = state_attr('sensor.omie_adjustment_price_pt', 'day_average')|float -%}
        {% set Desvios = 0 -%}
        {% set SAJ = 0.004 -%}
        {% set PFC = ((PMD+MIBEL)/1000) + Desvios + SAJ -%}
        {% set ER = 1 -%}
        {% set FA = 1.02 -%}
        {% set PT = 0.1507 -%}
        {% set CG = 0.005 -%}
        {% set TEPAi = -0.09580 -%}
        
        {{( (ER*PFC*(1+PT))*FA+(ER*CG)+(ER*TEPAi) ) | round(4) }}
      attributes:
        friendly_name: "Luzboa €/kWh em simples"
        formula: "(ER*PFC*(1+PT))*FA+(ER*CG)+)ER*TEPAi)"
        PMD: state_attr('sensor.omie_spot_price_pt', 'day_average')|float -%}
        MIBEL: state_attr('sensor.omie_adjustment_price_pt', 'day_average')|float -%}
        Desvios: {{ 0 | float }}
        SAJ: {{ 0.004 | float }}
        FA: {{ 1.02 | float  }}
        PT: {{ 0.1507 | float }}
        CG: {{ 0.005 | float }}
        TEPAi: {{ -0.09580 | float }}
    - unique_id: luzboa_spot_price_bihorario_diario
      unit_of_measurement: 'EUR/kWh'
      state_class: measurement
      state: >
        {% set PMD_v = (state_attr('sensor.omie_spot_price_pt', 'day_hours')[0:7]+state_attr('sensor.omie_spot_price_pt', 'day_hours')[22:23]) | average %}
        {% set PMD_fv = (state_attr('sensor.omie_spot_price_pt', 'day_hours')[8:21]) | average %}
        {% set PMD = PMD_v if now().hour < 8 or now().hour > 21 else PMD_fv -%}
        {% set MIBEL = state_attr('sensor.omie_adjustment_price_pt', 'day_average')|float -%}
        {% set Desvios = 0 -%}
        {% set SAJ = 0.004 -%}
        {% set PFC = ((PMD+MIBEL)/1000) + Desvios + SAJ -%}
        {% set ER = 1 -%}
        {% set FA = 1.02 -%}
        {% set PT = 0.1507 -%}
        {% set CG = 0.005 -%}
        {% set TAR_vazio = -118.5/1000 -%}
        {% set TAR_fora_vazio = -84.2/1000 -%}
        {% set TEPAi = TAR_vazio if now().hour < 8 or now().hour > 21 else TAR_fora_vazio -%}
        {{( (ER*PFC*(1+PT))*FA+(ER*CG)+(ER*TEPAi) ) | round(4) }}
      attributes:
        friendly_name: "Luzboa €/kWh em Bihorario Diario"
        formula: "(ER*PFC*(1+PT))*FA+(ER*CG)+)ER*TEPAi)"
        PH: {{ states('sensor.omie_spot_price_pt') | float }}
        MIBEL: {{ states('sensor.omie_adjustment_price_pt') | float }}
        Desvios: {{ 0 | float }}
        SAJ: {{ 0.004 | float }}
        FA: {{ 1.02 | float  }}
        PT: {{ 0.1507 | float }}
        CG: {{ 0.005 | float }}
        PMD_v: {{ (((state_attr('sensor.omie_spot_price_pt', 'day_hours')[:7]+state_attr('sensor.omie_spot_price_pt', 'day_hours')[22:23]) | average )/1000 | float) | round(4)}}
        PMD_fv: {{ (((state_attr('sensor.omie_spot_price_pt', 'day_hours')[8:21]) | average )/1000 | float) | round(4)}}
        TEPAi: >
          {% set TAR_vazio = -118.5/1000 -%}
          {% set TAR_fora_vazio = -84.2/1000 -%}
          {% set TEPAi = TAR_vazio if now().hour < 8 or now().hour > 21 else TAR_fora_vazio -%}
          {{ TEPAi }}
              
        
1 Curtiu

Boas!
A tua abordagem está correcta, parece-me que faz tudo sentido, tenho algo “semelhante”.
No entanto, como sabes, na Luzboa temos sempre a “incerteza” no valor do “PH”, pois não é uma média do dia (como tens), e sim uma média mensal, que de facto só sabemos no fim do mês / período de faturação (que já estão a ajustar para bater certo com a e-redes, de 21 a 20 de cada mês). O valor diário e mensal pede ser brutalmente diferente.
Ora isto põe várias questões, pois o futuro ninguém adivinha:

  1. valor certo, mesmo, só no fim do mês;
  2. o valor real da eletricidade, que usa a média mensal vai usar, até ao fim do mês (21 a 31±), um valor, a partir de dia 1 (a 20) já será com o valor do mês seguinte.
  3. não há volta a dar a isto.

Qual foi então a minha abordagem?
Bem, também tive de chegar a um “compromisso razoável”, e assumi que iria usar a média diária dos últimos 30 dias.
Problema: O meu recorder só grava 7 dias, e não estou para aumentar em 4x a minha base de dados para ter um histórico mensal no recorder só por causa de um sensor
Solução: Fiz um helper para me guardar o valor em kWh dos útlimos 30 dias e automação para recalcular diariamente:

  1. Helper: input_number com aumentos de 0,0001, fiz um para o SPOT e outro para o MIBEL, directamente na interface:
    a) input_number.omie_spot_media_kwh_30_dias_pt
    name: ‘OMIE - SPOT Média 30 Dias PT (kWh)’
    b) input_number.omie_mibel_media_kwh_30_dias_pt
    name: ‘OMIE - MIBEL Média 30 Dias PT (kWh)’
  2. Automação:
alias: OMIE - Calcular médias últimos 30 dias
description: "Calcular médias OMIE dos últimos 30 dias "
trigger:
  - platform: time
    at: "00:00:10"
condition: []
action:
  - service: input_number.set_value
    target:
      entity_id: input_number.omie_spot_media_kwh_30_dias_pt
    data:
      value: >-
        {{ ((29 * states('input_number.omie_spot_media_kwh_30_dias_pt')|float(default=0) +
        (state_attr('sensor.omie_spot_price_pt','day_average')|float(default=0)/1000))/30)|round(4) }}
  - service: input_number.set_value
    target:
      entity_id: input_number.omie_mibel_media_kwh_30_dias_pt
    data:
      value: >-
        {{ ((29 * states('input_number.omie_mibel_media_kwh_30_dias_pt')|float(default=0) +
        (state_attr('sensor.omie_adjustment_unit_price','day_average')|float(default=0)/1000))/30)|round(4) }}
mode: single

Sei que não é a melhor maneira de fazer a média, mas será uma muito boa aproximação, e não conseguindo ainda prever o futuro, é o que tenho.
That’s my 50c :wink:
Obrigado a todos!

Ao tentar criar o sensor tenho erro “{‘0 | float’: None}”. O sensor funciona consigo?

Já agora dou uma sugestão: Já que o valor principal que se pretende calcular para o sensor já tem as variáveis definidas em atributos, porque não usá-los, em vez de duplicar? Assim se fôr necessário alterar alguma coisa é só num sítio:
Usando o teu código:

    - unique_id: luzboa_spot_price_bihorario_diario
      unit_of_measurement: 'EUR/kWh'
      state_class: measurement
      state: >
        {% set PMD_v = state_attr(this.entity_id,'PDM_v')|float(default=0) %}
        {% set PMD_fv = state_attr(this.entity_id,'PDM_fv')|float(default=0) %}
        {% set MIBEL = state_attr(this.entity_id,'MIBEL')|float(default=0) -%}
        {% set Desvios = state_attr(this.entity_id,'Desvios')|float(default=0) -%}
        {% set SAJ = state_attr(this.entity_id,'SAJ')|float(default=0) -%}
        {% set FA = state_attr(this.entity_id,'FA')|float(default=0) -%}
        {% set PT = state_attr(this.entity_id,'PT')|float(default=0) -%}
        {% set CG = state_attr(this.entity_id,'CG')|float(default=0) -%}
        {% set TEPAi = state_attr(this.entity_id,'TEPAi ')|float(default=0) -%}
        {% set PMD = PMD_v if now().hour < 8 or now().hour > 21 else PMD_fv -%}
        {% set PFC = ((PMD+MIBEL)/1000) + Desvios + SAJ -%}
        {{ ((PFC*(1+PT))*FA+CG+TEPAi) | round(4) }}
      attributes:
        friendly_name: "Luzboa €/kWh em Bihorario Diario"
        formula: "(PFC*(1+PT))*FA+CG+TEPAi)"
        PH: {{ states('sensor.omie_spot_price_pt') | float }}
        MIBEL: {{ states('sensor.omie_adjustment_price_pt') | float }}
        Desvios: {{ 0 | float }}
        SAJ: {{ 0.004 | float }}
        FA: {{ 1.02 | float  }}
        PT: {{ 0.1507 | float }}
        CG: {{ 0.005 | float }}
        PMD_v: {{ (((state_attr('sensor.omie_spot_price_pt', 'day_hours')[:7]+state_attr('sensor.omie_spot_price_pt', 'day_hours')[22:23]) | average )/1000 | float) | round(4)}}
        PMD_fv: {{ (((state_attr('sensor.omie_spot_price_pt', 'day_hours')[8:21]) | average )/1000 | float) | round(4)}}
        TEPAi: >
          {% set TAR_vazio = -118.5/1000 -%}
          {% set TAR_fora_vazio = -84.2/1000 -%}
          {% set TEPAi = TAR_vazio if now().hour < 8 or now().hour > 21 else TAR_fora_vazio -%}
          {{ TEPAi }}

Assim só precisas mudar o valor das constantes nos atributos, e a fórmula principal apenas no sensor, em vez de repetires cálculos e fórmulas em ambos os lados. PS: não testei, não sei se tenho algum erro, mas acho que deu para entender a ideia. Eu por mim, além de tentar usar algo mais aproximado à média mensal, guardava também o valor do acesso às redes por exemplo num helper ou mais (input_number). Esse valor poderá servir depois também para cálculos em outro fornecedor, caso se mude, e assim também apenas se muda num sítio quando a ERSE decidir mudar e serve para tudo. Também o “ER” não é necessário num cálculo de valor unitário, pois o teu sensor quer calcular o valor de €/kWh, ou seja, de 1kWh, será sempre 1, podes eliminar que nunca te vai ser preciso (eliminei).

Boas.

Sim gosto da tua sugestão.

Com relação às médias, certo, o objectivo desta entity é unicamente calcular o custo unitary atual para usar no Dashboard de Energia do HA.
Depois com base neste criar outro helper que faz a média dos ultimo 30 dias desta entity com reset no primeiro dia do nosso ciclo de faturação e o mesmo também para o consumo em kWh.

Com relação ao ER sim, deixei unicamente para manter a formula igual à da LuzBoa mas é completamente redundante.

Nice.
Já estou a estudar outra forma de manter a média certa, a ideia será guardar os valores dos útlimos 30 dias numa lista, e todos os dias descartar o valor mais antigo e adicionar o novo do dia, refazendo depois o cálculo.

Já tenho isto a funcionar num template, pelo menos a lógica, tenho de ver a melhor forma de implementar:
Mas dá para testar a lógica da coisa, não sou muito bom neste tipo de templates, até pode haver forma melhor de implementar (aproveito para deixar aqui por 2 motivos, pode ser útil para mais alguém, e assim também não preciso guardar a lógica em lado nenhum antes de implementar :smiley: (para testar no Developer Tools / Templates) :

{%- set media_dia = [0,1,2,3,4,5,6,7,8,9,10] -%}
LISTA INICIAL = {{ media_dia }} -> Média = {{ media_dia|average -}}
{%- set novo_valor = 5.44 %}
Valor a adicionar = {{ novo_valor }}
{%- set novalista = namespace(z=[novo_valor])-%}
{% set novalista.z = novalista.z + media_dia[:-1] -%}
{% set listafinal = novalista.z %}
LISTA FINAL = {{ listafinal }} -> Média = {{ listafinal|average }}

Isto dá-me como resultado:

LISTA INICIAL = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -> Média = 5.0
Valor a adicionar = 5.44
LISTA FINAL = [5.44, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -> Média = 4.585454545454545

Portanto, a lógica funciona e não tenho de recorrer a bases de dados externas nem aumentar os dias do recorder.

EDIT: Depois de testar melhor, reparei que podia fazer directo:

{%- set media_dia = [0,1,2,3,4,5,6,7,8,9,10] -%}
{%- set novo_valor = 5.44 %}
LISTA INICIAL = {{ media_dia }} -> Média = {{ media_dia|average }}
Valor a adicionar = {{ novo_valor }}
{%- set listafinal = [novo_valor] + media_dia[:-1] %}
LISTA FINAL = {{ listafinal }} -> Média = {{ listafinal|average }}

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


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