Node RBE (report-by-exception) - Controle de fluxo para eliminar mensagens que não mudaram de valor!

Aproveitando um questionamento que foi feito no forum, deixo aqui a forma de utilização do node RBE, report-by-exception (relatório por exceção), que serve para bloquear a continuidade de um fluxo enquanto o valor não for alterado.

Isto é útil, por exemplo, quando utilizando um Sonoff Pow em uma automação e um mesmo valor continua sendo enviado seguidas vezes e só queremos a continuidade do fluxo quando este valor for alterado, ou então quando o valor de uma chave é repetido constantemente e só queremos quando o valor alterar.

Vou colocar dois exemplos simples para entendimento do funcionamento, que servirá de base para adaptação.

Exemplo 1:

02 inject
01 RBE
01 debug

image

Atribua os valores “0” e “4” aos injects como indicado:

image

image

Configure o RBE como indicado:

image

Para verificar a saída selecione o “debug messages” no ícone indicado:

image

Injete várias vezes o valor “0”:

image

Verá que somente um valor “0” é indicado no “debug messages” e não ocorre a repetição deste mesmo valor “0” a cada pressionamento.

image

Faça o mesmo com o valor “4” no segundo inject.

Verá que somente o primeiro valor “4” é indicado no “debug messages” e não ocorre a repetição deste mesmo valor “4” a cada pressionamento.

Injete várias vezes, alternadamente, ou não, os valores “0” e “4”.

Verá que a cada alteração do valor injetado há a indicação deste valor no “debug messages” e quando repetido não há nova indicação deste valor.

Ou seja, o RBE bloqueará todos os valores repetidos e só dará continuidade ao fluxo quando este valor for alterado.

Exemplo 2:

Supondo que uma máquina lava e seca está ligada à tomada através de um Sonoff Pow para criar automações, gerenciar o consumo de energia elétrica e notificar na Alexa cada ciclo que está sendo executado, caso não ocorra interrupção do fluxo ocorrerão seguidas notificações e outras automações no fluxo, sendo necessário apenas uma.
O RBE fará este controle, bloqueando as seguidas repetições.

Obs.:
1) Apenas para exemplo simples está sendo utilizado somente uma saída do node “switch” e uma parte de uma automação, que na prática seria mais completa;
2) também, está sendo suposto inicialmente que a potência indicada permanecerá em um único valor quando a lava e seca estiver somente ligada, ainda sendo programada, sem executar alguma ação (no caso 3W).

01 events state
01 switch
01 RBE
02 call services

Vou colocar somente a configuração de dois nodes necessários para entendimento.

Configuração do switch:

image

Configuração do RBE:

image

No caso, o RBE foi configurado como “Block unless value changes” (Bloqueie a menos que o valor mude), desta forma ocorrerá uma notificação na Alexa e enquanto o equipamento estiver somente sendo programado não ficará enviando diversas notificações do mesmo estado.

E se fosse adicionado um novo fluxo para notificar quando o equipamento estiver lavando, porém, o valor da potência não seja um valor fixo, mas esteja dentro de uma faixa de valores, por exemplo, de 5 a 15W?

Configuração do switch:

image

Configuração do novo RBE:

image

Neste caso, o RBE foi configurado como “Block if value change is greater or equal to”
(Bloqueie se a alteração do valor for maior ou igual a), e foi definido um intervalo de “8” (por estar trabalhando com número), desta forma o RBE não apenas estará bloqueando um valor fixo, mas todos os valores dentro da faixa de intervalo definida.

Enfim, são várias as possibilidades de acordo com o requerido na automação, alterando no RBE o “Mode”, o intervalo, a entrada ou saída e as propriedades.

Complemento para “Mode”:

a)
Block unless value changes.
Bloqueie a menos que o valor mude.

Block unless value changes (ignore initial value).
Bloqueie a menos que o valor mude (ignore o valor inicial).

Block unless value change is greater or equal to.
Bloqueie a menos que a alteração do valor seja maior ou igual a.

Block unless value change is greater than.
Bloqueie a menos que a alteração do valor seja maior que.

Block if value change is greater or equal to.
Bloqueie se a alteração do valor for maior ou igual a.

Block if value change is greater than.
Bloqueie se a alteração do valor for maior que.

b)
Compare to last valid output value.
Compare com o último valor de saída válido.

Compare to last input value.
Compare com o último valor de entrada.

Espero que possa ser útil!

6 curtidas