Automações
Repetição While
Originada das estruturas condicionais clássicas das linguagens imperativas, a repetição While executa um bloco enquanto a condição avaliada continuar verdadeira. Em Home Assistant, Node-RED e scripts, pode controlar polling, espera ativa e rotinas iterativas. Um limite de 100 ciclos ou timeout de 60 s é comum como proteção. O critério de escolha é usar While quando a continuidade depende do estado atual; a ressalva é que condição nunca alterada gera loop infinito e bloqueio de recursos.
⚙ Definição Técnica
Repetição While é uma estrutura de controle que avalia uma condição antes de cada iteração e executa o bloco somente enquanto o resultado permanecer verdadeiro. A forma pertence às linguagens imperativas consolidadas desde os primeiros compiladores estruturados e foi incorporada a motores de automação, scripts e fluxos visuais. A diferença central em relação ao For Each é que não existe coleção predeterminada; a continuidade depende de um estado reavaliado. Em relação ao Until, a polaridade muda: While repete enquanto a condição é verdadeira; Until repete até que uma condição se torne verdadeira. A aplicação requer uma variável ou estado capaz de mudar, um limite de segurança e política para timeout. Sem isso, o laço pode executar indefinidamente. Em Home Assistant, repeat while permite listas de condições; em Node-RED, loops precisam ser modelados com nós e retorno de mensagem; em scripts tradicionais, while(condition) é nativo. O mecanismo deve ser usado quando o número de ciclos é desconhecido, mas a condição de permanência é explícita e observável.
Tipos comuns de gatilhos
While para polling de estado externo
O laço consulta periodicamente uma API, dispositivo ou entidade enquanto o estado continua pendente. Exemplo: verificar a cada 5 s se um carregador terminou, até 60 s. O bloco precisa incluir delay; sem pausa, pode gerar centenas de consultas por segundo. Serviços externos aplicam rate limits e podem bloquear. A condição deve tratar timeout, erro e unavailable separadamente. Um 500 não significa “ainda pendente”. Retentativas precisam de backoff. Polling é aceitável quando não existe webhook, evento ou subscription. Se o sistema oferece atualização orientada a eventos, wait for trigger ou callback reduz carga e latência. O critério de escolha é a disponibilidade de mecanismo reativo e a frequência necessária.
While para manter uma ação durante condição verdadeira
A sequência repete enquanto presença, modo ou demanda permanece ativa. Um irrigador pode aplicar pulsos de 30 s enquanto umidade está abaixo do limiar. O laço precisa reavaliar sensor e impor duração máxima. Sensores lentos podem manter valor antigo e causar excesso. O processo físico possui inércia: a umidade medida pode subir minutos depois. Histerese e tempo de assentamento são necessários. Para atuadores críticos, use controlador dedicado e intertravamentos. Um loop de automação genérico não substitui proteção elétrica ou de processo. A execução deve parar em falha de sensor, não continuar assumindo necessidade.
While para consumir itens de uma fila local
Enquanto a fila contém elementos, o laço remove um item e processa. A condição observa tamanho > 0. Esse padrão é comum em scripts e workers. Em automação residencial, pode tratar eventos acumulados, mas exige exclusão mútua. Duas instâncias consumindo a mesma fila podem processar o mesmo item ou alterar ordem. Use modo queued, lock ou um consumidor único. Cada item precisa de status, idempotência e política de falha. Se um item retorna à fila, evite ciclo sem fim. Dead-letter após N tentativas preserva. O laço deve ceder execução entre itens para não bloquear o motor.
While com contador e limite adicional
Mesmo quando a condição principal deveria terminar, um contador máximo protege. Exemplo: enquanto janela estiver aberta e repeat.index <= 20, enviar lembrete a cada 3 min. O limite produz teto de 60 min. Em plataformas que expõem índice, use. Caso contrário, variável incremental. A inicialização precisa ocorrer por execução, não globalmente. Em paralelo, contadores compartilhados se misturam. O limite não substitui timeout de ações internas. Se cada ciclo pode levar 30 s, 20 ciclos alcançam 10 min além dos delays. Defina duração total. Ao atingir o teto, registre motivo e encaminhe para alerta, não apenas encerre silenciosamente.
While para reconciliação até estado desejado
A automação envia comando e verifica se o dispositivo atingiu o estado. Enquanto não, tenta novamente com limite. O padrão ajuda em enlaces instáveis, mas pode mascarar defeito. Use confirmação real, como contato de porta, e não apenas estado otimista da integração. Retentativas precisam de intervalo crescente e número máximo. Um comando destravar repetido possui risco. Prefira set state idempotente e valide autorização. Se a falha persiste, interrompa e alerte. Para protocolos com ACK, a camada de integração já pode retentar; duplicar no nível da automação aumenta tráfego. Conhecer a interoperabilidade evita repetição em camadas.
Considerações de Implementação
Loop infinito ocorre quando a condição não muda
Se nenhuma ação, evento ou fonte externa altera o predicado, While nunca termina. Mesmo quando existe mudança esperada, falha de sensor ou API pode congelar. Todo laço deve possuir timeout, contador máximo ou condição de cancelamento independente. Um watchdog do motor pode abortar, mas não deve ser a estratégia. Registre número de ciclos, duração e estado final. Em Home Assistant, reinício pode interromper; isso evita bloqueio, mas deixa processo parcial. O desenho precisa prever recuperação. Um loop sem limite é erro de arquitetura.
Laços rápidos sobrecarregam CPU, rede e dispositivos
Reavaliar sem delay cria busy loop. Em poucos segundos, milhares de templates, consultas ou chamadas podem ser executados. Inclua pausa compatível com a dinâmica. Temperatura não precisa de 100 Hz; estado de API pode aceitar 2–10 s. Para eventos rápidos, use mecanismo reativo. Limite de taxa e métricas protegem. Em Zigbee ou Wi‑Fi, comandos repetidos congestionam e elevam latência de toda a casa. O intervalo deve considerar capacidade e necessidade, não apenas rapidez aparente.
A condição é avaliada antes do primeiro ciclo
Se inicia falsa, o bloco não executa nenhuma vez. Quando uma ação precisa ocorrer ao menos uma vez, Until ou do-while equivalente é mais adequado. Algumas plataformas não oferecem do-while; pode-se executar uma ação antes e depois entrar no While. Essa diferença deve ser testada. Em automações de verificação, não presumir primeira execução evita omissões. O trace deve mostrar condição inicial. Valores restored ou unavailable podem impedir o loop no boot. Uma rotina de reconciliação separada pode ser necessária.
Cancelamento externo e modo de execução precisam ser definidos
Um novo gatilho pode iniciar outra instância, reiniciar a atual, entrar em fila ou ser rejeitado. Um While longo amplifica a diferença. Para ocupação, restart pode renovar. Para processo que não deve duplicar, single ou queued. Também pode haver botão de cancelamento ou helper. A condição deve consultar. Ao cancelar, execute limpeza: desligar atuador, liberar lock e registrar. Cancelamento abrupto sem finally pode deixar saída ligada. Scripts encapsulados com bloco de finalização melhoram.