ERSE - Contabilizar os custos com Energia Elétrica (Versão Janeiro 2021)

Também acho que vou tentar fazer isso. Já tens alguma coisa?
Agora, sabemos o horário das medições? é fixo? Começa à hora certa e depois conta a cada 15min?, 4x por hora?
Já estive a testar o “cron pattern” e deve ser algo como “0,15,30,45 * * * *” ou “*/15 * * * *”, acho que dão a mesma coisa.
Esquematizando o meu pensamento:

A ideia será ter, contabilizados a cada 15 min:

  • SALDO energia 15min (kWh) == Consumo Rede (kWh) - Excesso Rede (kWh)
    • Se “SALDO Energia 15min >= 0” , Consumo diário = Consumo diário + SALDO Energia 15min
    • Se “SALDO Energia 15min < 0” , Excedente diário = Excedente diário + | SALDO Energia 15min |
  • daqui, passar para somatório diário e mensal (utility_meters), certo?

Estou um pouco a divagar e a tentar eu próprio perceber ao escrever, e vou tentar fazer; é um encadeamento grande de medições, algo a fazer com calma.
Acho que vou fazer aqui mesmo, e vou adicionando:

Sensores de origem (W):

  • sensor.consumo_rede_power
  • sensor.excedente_rede_power
sensor:

  - platform: integration
    name: "Consumo Rede Energy"
    source: sensor.energia_rede_power
    unit_prefix: k
    round: 2
    unit_time: h
    method: left
  
  - platform: integration
    name: "Excedente Rede Energy"
    source: sensor.excedente_rede_power
    unit_prefix: k
    round: 2
    unit_time: h
    method: left

utility_meter:

  consumo_rede_15min:
    source: sensor.consumo_rede_energy
    cron: "*/15 * * * *"
  excedente_rede_15min:
    source: sensor.excedente_rede_energy
    cron: "*/15 * * * *"

  daily_consumo_rede_15min:
    source: sensor.consuno_rede_15min
    cycle: daily
  daily_excedente_rede_15min:
    source: sensor.excendente_rede_15min
    cycle: daily

  monthly_consumo_rede_15min:
    source: sensor.consuno_rede_15min
    cycle: monthly
  monthly_excedente_rede_15min:
    source: sensor.excendente_rede_15min
    circle: monthly

(WIP)

  • estou a fazer no telemóvel.
  • a ter ainda em conta as tarifas
  • não sei se é possível encadear utility_meters desta maneira, foi o que me ocorreu para já, sem pensar muito.

Como vou entrar em produção oficial dia 22, isto interessa-me bastante.
@dgomes, o expert deste assunto, talvez possa ajudar (em mais uma coisa, lol)
Obrigado desde já!

Muito sinceramente nao faço ideia como é que o monthly_consumo_rede_15min se vai comportar com um source que é tb um utility_meter… mas fico a aguardar feedback :slight_smile:

Eventualmente podemos pensar em construir um custom component para resolver este use case

1 Curtiu

Ainda não cheguei ao computador para testar, mas mais daqui a pouco vou experimentar.
A questão do encadeamento dos utility_meters também é o que me preocupa. Quanto às parte do custom_conponent, foi por isso que te “taggei”, dentro do HA já mexo relativamente bem, mas adicionar coisas fora “do normal”, e neste caso, só podia pensar em ti. Foi um “tag” malvado :blush:.
E obrigado!!!

Bem, lá se vai a minha ideia. O utility_meter acusa referência circular e não permite…

Invalid config for [utility_meter]: [circle] is an invalid option for [utility_meter]. Check: utility_meter->utility_meter->monthly_excedente_rede_15min->circle. (See /config/configuration.yaml, line 62).

Ideias? Talvez criar um template para acumular os valores de 15 em 15 minutos (-1 ou 2 segundos antes da hora do reset do utility_meter), e esse sim, já daria para voltar a integrar noutro utility_meter, não?

Achei isto: https://github.com/reptilex/plainsum

Ou criar um template sensor baseado em tempo, que aos minutos 0 / 15 / 30 / 45 de cada hora calcule o máximo do utility_meter nos últimos 15 minutos (ou 5, por exemplo, é igual…)… Não sei estou por aqui a divagar…

- platform: statistics
  name: Consumo Máximo Últimos 15 min (kWh)
  entity_id: sensor.p15min_energy_consumo_rede
  state_characteristic: value_max
  max_age:
    minutes: 14

- platform: statistics
  name: Excedente Máximo Últimos 15 min (kWh)
  entity_id: sensor.p15min_energy_excedente_rede
  state_characteristic: value_max
  max_age:
    minutes: 14

Estes são os sensores provenientes do utility_meter, de 15 em 15 min:
image image

Este um de estatísticas (max últimos 15min):
image

O que falta:
Criar outro sensor para somar apenas de 15 em 15 minutos o valor das estatísticas (serve ao minuto 1 / 16 / 31 / 46 . Não queria usar automações.

E continuando a divagar:


Editor de templates:

CONSUMO: {{ states('sensor.consumo_maximo_ultimos_15min_kwh')|float(default=0) }}
EXCEDENTE: {{ states('sensor.excedente_maximo_ultimos_15min_kwh')|float(default=0) }}

Se consumo > excedente, adiciona ao consumo a diferença;
caso contrário adiciona ao excedente a diferença:
{% if states('sensor.consumo_maximo_ultimos_15min_kwh')|float(default=0) > states('sensor.excedente_maximo_ultimos_15min_kwh')|float(default=0) %}
  CONSUMO REDE = + {{ states('sensor.consumo_maximo_ultimos_15min_kwh')|float(default=0) - states('sensor.excedente_maximo_ultimos_15min_kwh')|float(default=0) }}
{% else %}
  EXCEDENTE REDE = + {{ states('sensor.excedente_maximo_ultimos_15min_kwh')|float(default=0) - states('sensor.consumo_maximo_ultimos_15min_kwh')|float(default=0) }}
{% endif %}


Minuto a usar para calcular:
{% set minutos = now()|as_timestamp|timestamp_custom('%M')|int(default=0) %}
{% set segundos = now()|as_timestamp|timestamp_custom('%S')|int(default=0) %}
{% if (minutos in [1,16,31,46]) and  (segundos == 0) %}
  CALCULA = TRUE
{% endif %}

Devo estar a fazer um bicho de 7 cabeças disto, mas estou um pouco perdido, lol. Acho que realmente isto vai precisar de algo mais do que usar o que já existe no HA @dgomes. Mas vou ver o que consigo…

se poderes tolerar um atraso de 15min nos valores:

Em principio irá funcionar

1 Curtiu

OK, BOA! :slight_smile: Não estou ainda a ver, mas claro que vou explorar! o atraso de 1 período acho ser pouco relevante. Muito obrigado!!!

Seguindo a tua ideia, isto é o que tenho neste momento:

sensor:
  # PONTO 2: Estes sensores usam os primeiros 2 utility_meters, que contabilizam de 15 em 15 minutos:
  - platform: template
    last_15min_period_consumo_energy:
      friendly_name: Consumo Rede 15min
      value_template: >
        {% set consumo = state_attr('sensor.p15min_energy_consumo_rede','last_period')|float(default=0) %}
        {% set excedente = state_attr('sensor.p15min_energy_excedente_rede','last_period')|float(default=0) %}
        {% if consumo > excedente %}
          {{ consumo - excedente }}
        {% else %}
          0
        {% endif %}

    last_15min_period_excedente_energy:
      friendly_name: Excedente Rede 15min
      value_template: >
        {% set consumo = state_attr('sensor.p15min_energy_consumo_rede','last_period')|float(default=0) %}
        {% set excedente = state_attr('sensor.p15min_energy_excedente_rede','last_period')|float(default=0) %}
        {% if excedente > consumo %}
          {{ excedente - consumo }}
        {% else %}
          0
        {% endif %}

utility_meter:

  # PONTO 1: Contabilização de 15 em 15 minutos, baseada em sensores de energia (kWh), que uso para tudo o resto.
  p15min_energy_consumo_rede:
    source: sensor.energia_rede
    cron: "*/15 * * * *"
  p15min_energy_excedente_rede:
    source: sensor.energia_excedente
    cron: "*/15 * * * *"

  # PONTO 3: Utility meters baseados no nos templates criados acima, com 'delta_values = true'
  daily_energy_consumo_rede_15min:
    source: sensor.last_15min_period_consumo_energy
    cycle: daily
    tariffs:
      - Fora de Vazio
      - Vazio
    offset:
      days: 20
    delta_values: true
  monthly_energy_consumo_rede_15min:
    source: sensor.last_15min_period_consumo_energy
    cycle: monthly
    tariffs:
      - Fora de Vazio
      - Vazio
    offset:
      days: 20
    delta_values: true

  daily_energy_excedente_rede_15min:
    source: sensor.last_15min_period_excedente_energy
    cycle: daily
    delta_values: true

  monthly_energy_excedente_rede_15min:
    source: sensor.last_15min_period_excedente_energy
    cycle: monthly
    delta_values: true

Podes dar uma olhada, por favor, a ver se a tua ideia era algo como isto? Não me deixa mais uma vez :sob:, continua a acusar referência circular, nos utility_meters do PONTO 3… :expressionless:! Obrigado mais uma vez, @dgomes.

Faz paste do erro sff, mas parece que não é por ai…

Não sei o que se passou, hoje de manhã “descomentei” os utility_meters e… validou. Vou hoje testar isto desta forma! :star_struck:

Bem, após as primeiras horas, fica aqui a minha análise do resultante desta abordagem, para contabilização de 15 em 15 minutos:

sensor.last_15min_period_consumo_energy
image

sensor.last_15min_period_excedente_energy

Só desta análise vejo que provavelmente as minhas estimativas de retorno monetário provavelmente irão sair um pouco defraudadas. Esteve um dia muito nublado, e é possível que em nenhum período de 15min o excedente tenha ultrapassado o consumo. Tal só poderia ocorrer quando os o sensor de consumo nos útlimos 15 minutos estivesse a 0; aconteceu em alguns períodos, mas provavelmente não chegou a dar saldo positivo para o excedente. Terei de analisar mais dias.
Com os sensores que tinha, a contabilizarem o valor bruto, teria vendido cerca de 1,08Kwh, enquanto na realidade não vendi nada pela contabilização dos períodos de 15min.
image
(por acaso os meus utility_meters fizeram reset hoje, pois a contabilização está feita a partir de dia 21.

Quanto aos sensores resultantes do utility_meter, parecem estar a funcionar como deve ser, pelo menos para o consumo:


(não tive ainda consumo em vazio desde que criei os sensores e utility_meters)

Obrigado, @dgomes, acho que isto vai ajudar MUITA gente! Se vir resultados estranhos ou se achar que alguma coisa está mal, actualizo este post.

1 Curtiu

Bem, isto ainda não está perfeito:

last_15min_period_consumo_energy:
image
last_15min_period_excedente_energy:

Estes sensores deveriam ser mutuamente exclusivos, mas no período das 14:00 às 14:15 ambos os sensores deram positivo, não consigo perceber porquê… (são os sensores que coloquei no post acima ).
Alguém tem algum ideia? Isto interessa a mais alguém? Se sim, devo fazer um post independente, mais estruturado?


Na sequência do anterior, estou agora a precisar de uma ajuda. Já consegui ter o meu sensor que contabiliza o excedente de energia “correctamente”, e preciso criar outro para ter o valor de compensação monetário correspondente.

O que tenho:

  1. sensor.total_energy_excedente_rede_15min_soma:



    Este sensor nunca fará reset, será sempre incremental e representa os kWh excedentes totais.

  2. sensor.preco_electricidade_venda_kwh:



    Este sensor tem um valor variável, e reflecte o meu preço de venda nesse dia (ou momento)

UPDATE: acho que já consegui o que queria, e vou fazer um tutorial com package para que tiver interesse. Está em fase de elaboração.

1 Curtiu

Boas. Antes demais, excelente o trabalho do pessoal. Eu sou novo no HA e tenho aprendido muito com vocês.

Testei este código e acho que encontrei um bug: se o valor atual de “last_15min_period_consumo_energy” for igual ao do last_period, parece me que depois as restantes contagens diárias, mensais, etc… não são incrementadas. Ou seja, supondo que “last_15min_period_consumo_energy” tem sempre os mesmos valores a cada 15m, esta energia não é incrementada.

Podem confirmar isto? Se se confirma, como se pode resolver?

Boas! Bem, o objectivo é mesmo esse: o sensor.p15min_energy_consumo_rede mede kWh e é sempre incremental (state_class = total_increasing), nunca faz reset, ou seja, representa toda a energia acumulada.
o que o last_15min_period_consumo_energy faz é obter os valores dos últimos 15 minutos, quer de consumo quer de excedente, e calcula a diferença, neste caso para saber se deve ou não contabilizar mais consumo.
Não sei se estou a perceber bem a tua pergunta, talvez me esteja a falhar qualquer coisa.
Entretanto, já alterei bastante o código que tinha em cima, já afinei bugs que tinha, já salvaguardei certas situações, e estou a tentar fazer um “package” com tudo, vou colocar aqui assim que conseguir ter tempo.

1 Curtiu

Boas.
Há uns dias que o consumo está a cair na tarifa errada.
No YAML tenho a seguinte configuração:

utility_meter:
  carro:
    source: sensor.carro_channel_1_power
    cycle: monthly
    tariffs:
      - Fora de Vazio
      - Vazio
    offset:
      days: 1
      hours: 0
      minutes: 1

sensor:
  - platform: integration
    source: sensor.carro_channel_1_power
    name: energy_spent
    unit_prefix: k
    round: 2
  - platform: template
    sensors:
      carro_energia_vazio:
        friendly_name: "Energia Carro Vazio"
        value_template: "{{ (states('sensor.carro_vazio')|float / 1000) | round(2) }}"
        unit_of_measurement: "kW"
      carro_energia_fora_vazio:
        friendly_name: "Energia Carro Fora de Vazio"
        value_template: "{{ (states('sensor.carro_fora_de_vazio')|float / 1000) | round(2) }}"
        unit_of_measurement: "kW"
      fatura_energia:
        friendly_name: "Eletricidade Carro"
        value_template: "{{ (states('sensor.carro_energia_vazio')|float * 0.1118 * 0.99 + states('sensor.carro_energia_fora_vazio')|float * 0.1683 * 0.99 + 5) | round(2) }}"
        unit_of_measurement: "€"

Esta noite aconteceu isto no fora de vazio:

No vazio, ontem estava ok mas hoje nada:

O que pode estar errado?

Obrigado

versao do ERSE e do HA ? Com 2022.04 é preciso fazer upgrade ao ERSE

Home Assistant 2022.4.3 e ERSE 2.1.5.
Entretanto removi o ERSE e voltei a adicionar e agora não me aparecem entidades disponíveis:
image

O que reparei é que se tivermos um Utility Meter definido com delta_values=true, se o sensor source for de um consumo sempre constante e de valores consecutivamente iguais, não vai haver incremente e logo falha da contagem.

Consegui contornar isto usando uma automação para ler os valores aos minutos/segundos 14:49, 29:59, 44:59 e 59:59 e depois outra automação para zerar um minuto depois. Assim, tenho basicamente impulsos com resulta bem depois com o utility meter e delta_values=true

OK, eu ainda não detectei esse comportamento, para mim está a funcionar bem, mas claro que vou analisar.
Pelo que dizes, “se o sensor source for de um consumo sempre constante e de valores consecutivamente iguais”, acho que estás a usar um sensor de consumo em Watts (power) em vez de um em kWh (energy), aí sim faz sentido o que dizes; se tens em Watts tens primeiro de passar pelo “Integration”, para teres o consumo de energia acumulado, e usar esse. Pelo integration, se tens consumo em Watts, de certeza que o valor resultante não vai ter períodos iguais consecutivos. Não será isso???

Não. O sensor source é mesmo energia. Portanto, se o Utility Meter estiver definido como delta_values=true, se o saldo de energia a cada 15m consecutivos tem o mesmo valor, a variação é zero e portanto, o utility meter não vai contabilizar essa energia, o que está incorreto.

Não devo estar mesmo a perceber, e vou tentar ver. Mas se o acumulado de energia tem o mesmo valor (o sensor de entrada em kWh), quer dizer que não houve qualquer consumo, portanto o utility meter tem de registar variação 0. Que valor deveria dar?


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


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