Saber quando a energia está mais barata, a tempo de a usar

Pode ler os preços de ontem em qualquer ecrã. O difícil é saber, neste momento, se este período de 15 minutos é um dos baratos — e ter algo que atue sobre isso sem que tenha de escrever uma comparação de preços à mão e reescrevê-la sempre que a sua tarifa muda.

O hub faz a comparação. Calcula quais os períodos baratos segundo as regras que definiu e publica uma mensagem pequena a dizer o que está aberto agora e o que abre a seguir. Outra coisa lê essa mensagem e atua.

⚠️ O hub não comuta nada. Não tem relé, nem qualquer definição que o faça ligar ou desligar seja o que for. Calcula janelas e publica-as. A decisão e a comutação pertencem ao que lê a notificação — uma automação do Home Assistant, um divisor de excedente, um carregador que subscreve o MQTT por si próprio. Se procurava um dispositivo que controle uma carga pelo preço, não é este.


Não é só para preços dinâmicos

As regras funcionam sobre o preço de compra tudo incluído de cada período de 15 minutos: o preço dinâmico, quando existe um para esse período, e caso contrário a taxa da zona do seu plano, com os respetivos encargos. Por isso, um hub num plano horário simples também recebe janelas baratas — simplesmente seguem as suas próprias zonas, e as tarifas de rede horárias contam para a comparação como tudo o resto.

Isto significa que esta página vale a pena ser lida quer use ou não preços dinâmicos. O que muda com um preço de mercado é o quanto os períodos baratos se deslocam de dia para dia; o mecanismo é o mesmo.

As regras precisam de o relógio do hub estar definido, e usam o fuso horário do próprio hub para decidir o que significam "um dia" e "07:00" — ver Hora.


Três tipos de regra

Até oito regras, cada uma com um nome que escolhe, e cada uma pode ser ativada e desativada individualmente. Um nome tem no máximo 23 bytes tal como o hub o guarda — a aplicação diz isto claramente, e uma letra cirílica conta como dois.

Preço abaixo de um nível

A aplicação chama-lhe Price below a level. Indica um preço igual ou inferior ao qual a janela abre, e um preço igual ou superior ao qual fecha — a janela é um sinal, e o que fazer com ele continua a cargo do que o lê.

Parâmetro
on_below ativa enquanto o preço de compra tudo incluído estiver igual ou abaixo deste valor
off_above mantém-se ativa até o preço atingir este valor; tem de ser igual ou superior a on_below

Os dois níveis existem para que um preço que oscile em torno de um número não faça a janela piscar ligada e desligada a cada período. Se os definir iguais, obtém exatamente esse piscar, por isso deixe uma diferença entre eles.

Use quando o seu limiar é absoluto: "funcionar enquanto a eletricidade estiver abaixo de 10 cêntimos, sempre que isso acontecer."

Períodos mais baratos num intervalo de tempo

A aplicação chama-lhe Cheapest periods in a time span — «para uma carga que pode funcionar em qualquer altura de um intervalo, como um termoacumulador». Indica um número de períodos de 15 minutos e as horas dentro das quais procurar.

Parâmetro
periods de 1 a 96, cada um de 15 minutos
from_h, to_h a janela diária, em horas locais; to_h igual ou anterior a from_h atravessa a meia-noite, e horas iguais significam as 24 horas inteiras
consecutive quando ativo, os períodos têm de formar um bloco contínuo

Use quando o que conhece é a quantidade de tempo de funcionamento: "os quatro períodos de 15 minutos mais baratos entre as 22:00 e as 06:00." Com consecutive ativo obtém uma hora contínua em vez de quatro períodos dispersos — o que é o desejável para tudo o que não gosta de ser interrompido.

Períodos mais baratos antes de uma hora

A aplicação chama-lhe Cheapest periods before a time — «para uma carga que tem de estar concluída até uma hora, como um VE às 07:00». A ideia é a mesma que a anterior, ancorada na hora até à qual tem de terminar.

Parâmetro
periods de 1 a 96
deadline_h a hora local até à qual tem de estar concluída
consecutive como acima

O hub olha para as 24 horas que terminam nessa hora, todos os dias, e escolhe nelas os períodos mais baratos.

Use quando o prazo é a restrição real: "dê-lhe duas horas de funcionamento antes das 07:00, e escolha as duas horas mais baratas da noite para o fazer."

Uma regra é recusada em vez de ser cortada em silêncio se não puder ser cumprida — pedir mais períodos do que a janela contém devolve a indicação do campo errado. Isto é deliberado: uma janela silenciosamente encurtada para caber seria uma regra diferente da que escreveu.


Duas bandeiras, para quando não precisa de uma janela

Além das regras, dois níveis simples:

Bandeira Verdadeira enquanto
Buy is cheap below o preço de compra agora estiver igual ou abaixo do nível que definiu
Sell is low below o preço de venda agora estiver igual ou abaixo do nível que definiu — a exportação vale pouco, ou nada

Se deixar um nível por definir, a respetiva bandeira fica falsa. Estas não são janelas: não há histerese nem planeamento antecipado, apenas uma afirmação sobre o preço neste momento. A bandeira de venda é a que deve vigiar numa instalação com produção: é o sinal de barato para usar a sua própria energia em vez de a exportar.


O que é publicado

Uma mensagem, com menos de um quilobyte, em rbgrid/<mac>/price — retida, para que quem se ligar mais tarde ainda receba o estado atual de imediato. Também em GET /api/v1/signal, e na versão ESPHome através de rbgrid_cmd.

Campo O que lhe diz
period_from, period_until o período de 15 minutos a que isto se refere
buy, sell, currency o preço agora
price_state, provenance o estado do preço dinâmico, e de onde vem este preço: o seu fornecedor, a reserva, um envio do Home Assistant, a média horária ou o seu plano
rank_buy, rank_sell a posição deste período no seu dia local, sendo 1 o mais barato; 0 significa que ainda não se sabe
periods_today quantos períodos de hoje são conhecidos — o denominador dessa posição
windows[] uma entrada por regra ativada: o nome, se está ativa, até quando, e quando volta a começar
buy_cheap, sell_low as duas bandeiras
ts, v quando a mensagem foi construída, e a versão do seu esquema

É um estado, não um evento

A notificação é republicada a cada limite de 15 minutos, e de imediato sempre que algo muda — uma janela a abrir ou a fechar, novos preços a chegar, uma regra ou um nível editado.

Construa a sua automação sobre o valor atual, e não sobre a chegada de uma mensagem. Um consumidor que trate cada publicação como um evento vai disparar repetidamente ao longo de uma janela longa e vai perder uma transição que ocorreu enquanto estava offline. Um consumidor que lê windows[].active e atua sobre o que lá está está certo em cada momento, incluindo no momento em que volta a ligar-se — que é para isso que serve retained.

As aberturas e os fechos são também escritos no registo do próprio hub, onde pode lê-los depois em Eventos:

price: window 'Boiler' on until <time>
price: window 'Boiler' off, next <time>

O exemplo, desenhado com honestidade

Uma caldeira que funciona nas duas horas mais baratas da noite:

  1. No hub: uma regra com o nome Boiler, do tipo cheapest periods of a daily window, 8 períodos, das 22:00 às 06:00, com consecutive ativo.

  2. No Home Assistant: uma automação disparada pelo tópico MQTT rbgrid/<mac>/price (ou, na versão ESPHome, pela entidade do próprio hub).

  3. A sua condição lê a entrada chamada Boiler em windows[]. Ativa — o Home Assistant liga o interruptor da caldeira. Não ativa — desliga-o.

Cada decisão desta lista depois do passo 1 é do Home Assistant. O hub contribuiu com uma frase: este período está na janela que descreveu. Um divisor ou um carregador que subscreva o tópico por si próprio funciona da mesma maneira, e a divisão é a mesma: o hub afirma um facto sobre o preço, e o outro dispositivo decide o que fazer com ele.

O que também significa que o hub não pode ser a razão para algo não ter funcionado. Se a automação não disparou, a notificação é a primeira coisa a ler — diz o que o hub acreditava, e isso pode ser verificado.


O que não faz

  • Nenhuma comutação de qualquer tipo pelo hub. Este é todo o desenho, não uma lacuna à espera de ser preenchida.

  • Oito regras. Uma nona é recusada, não descartada em silêncio.

  • Sem janelas no lado da venda. As janelas usam o preço de compra tudo incluído; para a exportação use a bandeira sell is low.

  • Nada acontece sem um relógio definido. As regras descrevem horas e dias, e um hub que não sincronizou o relógio não as consegue situar.


Quando não faz o que esperava: o que verificar

Uma janela nunca abre. Leia a própria notificação — windows[] traz next_start para cada regra ativada. Se next_start estiver lá, a regra está a funcionar e está adiantado. Se a regra não estiver na lista, está desativada.

Uma janela abre a uma hora diferente todos os dias, e eu esperava uma hora fixa. É uma regra de períodos mais baratos a fazer o seu trabalho: os períodos baratos deslocam-se quando os preços se deslocam. Se quiser as mesmas horas todos os dias, precisa de uma zona no seu plano, e não de uma janela.

A janela pisca ligada e desligada. Uma regra de preço abaixo de um valor com os dois níveis demasiado próximos, e um preço entre eles. Aumente a diferença entre o ligar e o desligar.

A minha regra foi recusada quando a guardei. A resposta indica o campo. Os dois habituais: mais períodos do que a janela consegue conter, ou um preço de desligar abaixo do preço de ligar.

As janelas ignoram o preço dinâmico e seguem o meu plano. Seguem o preço de compra tudo incluído de cada período, que recorre ao plano sempre que nenhum preço dinâmico cobre esse período. Verifique o campo provenance na notificação: plan aí significa que nenhum preço de mercado estava em vigor para esse período — ver De onde vem o seu preço.

rank_buy é 0. A posição ainda não tem denominador: os preços de hoje ainda não são totalmente conhecidos. Vai sendo preenchida à medida que os preços chegam.

A minha automação dispara vezes sem conta durante a mesma janela. Está a disparar na mensagem em vez de ler o estado. A notificação é republicada a cada 15 minutos, por desenho; condicione a automação a windows[].active.

A minha automação falhou uma janela que o registo diz que abriu. O consumidor estava offline na transição e está à espera de um evento que já aconteceu. Leia a mensagem retida ao ligar-se — é para isso que serve ser retida.

As horas estão erradas por um desvio fixo. As regras usam o fuso horário do próprio hub, e não o do seu telemóvel ou do Home Assistant. Verifique Hora.

Quero que a janela tenha também em conta a minha tarifa de potência. Não tem — as janelas tratam do preço por quilowatt-hora. A importação mais alta de um ciclo de faturação é medida em separado e não entra em preço nenhum: ver Picos de importação.

⚠️ Para qualquer trabalho dentro de um quadro elétrico, chame um eletricista qualificado.