# Alarmes

> O editor de alarme: identidade e endereço, a condição, o cartão Comportamento com prioridade, notificação, atrasos, mensagem e reconhecimento, o trilho Estado, a máquina de estados, a anunciação, e o Reconhecer e o Reconhecer tudo.

Um alarme vigia uma condição booleana e conduz uma máquina de estados de reconhecimento, para que uma condição que importava nunca possa ir e vir sem ser vista. Selecione um alarme sob a raiz Alarms da coluna da Logic, ou pressione **Abrir** na linha dele na tabela da pasta ou da raiz da seção, para abrir o editor dele (um alarme feito com Novo… > Novo alarme não é aberto, e sim destacado nessa tabela, veja [Criar e copiar](logic#creating-and-copying)); ler exige **Ver a lógica**, editar exige **Configurar a lógica**, reconhecer exige **Operar a lógica**.

O cabeçalho mostra a marca de alarme (tocando enquanto o alarme está ativo), o nome, a frase "Uma condição que esta estação vigia: enquanto ela vale, o alarme se anuncia e espera ser reconhecido.", uma pílula com o estado atual (Sem alarme; Ativo, não reconhecido; Ativo, reconhecido; Normalizado, não reconhecido) e uma pílula **Desabilitado** enquanto o alarme está desligado. A coluna do formulário contém IDENTIDADE, CONDIÇÃO e COMPORTAMENTO; o trilho contém ESTADO.

## Identidade {#identity}

| Campo | O que é | Valores / padrão | Efeito |
| --- | --- | --- | --- |
| Nome | O nome de exibição; o segmento higienizado dele é o endereço sob `Alarms`. | Texto livre; um alarme novo é `AlarmN`. | Confirma pela renomeação segura, como o [nome de uma variável](logic-variables#name-and-address): uma prévia das referências que acompanham, Enter ou sair do campo para confirmar, "Alarme renomeado e N referências atualizadas." Renomear preserva o estado ao vivo e um reconhecimento pendente. Um nome que colide é recusado no lugar. |
| Linha do endereço | `Alarms.<folders>.<segment>`, ecoada sob o nome. | Somente leitura. | Expressões e scripts leem o estado do alarme por ela (`Alarms.HighLevel.IsActive`). |
| Descrição (opcional) | Texto livre. | Vazia. | Nenhum. |

## Condição {#condition}

O cartão CONDIÇÃO é o [editor de script](logic-expressions#the-script-editor) com a dica "Uma única expressão JavaScript booleana sobre o espaço de endereços, por exemplo Connector.Simulated.Pump.Temp.ValueToReal() > Variables.SetpointHigh.ValueToReal(). As condições não podem referenciar outros alarmes." A condição segue toda [regra de expressão](logic-expressions): uma expressão somente leitura, endereços estáticos, a porteira da qualidade, o limite de 250 ms. Ela pode referenciar tags, variáveis dos dois tipos, pontos do Process, Assets e os diagnósticos, nunca `Alarms.*`, e precisa produzir um booleano ("A condição precisa resultar em um booleano, mas ela produziu '…'."). Uma condição que não pode ser avaliada numa varredura (um ponto referenciado Ruim, ausente ou vazio) é incerteza: a máquina de estados mantém o último estado dela.

## Comportamento {#behavior}

| Campo | O que é | Valores / padrão | Efeito |
| --- | --- | --- | --- |
| Prioridade | A severidade. | Crítica, Alta, Média (padrão), Baixa; cada opção é desenhada na cor da severidade dela. | Mostrada no ponto da árvore, em todo resumo, no cartão da tarja de notificação, no diário e no indicador da barra de status; nas marcas compartilhadas, vence a pior prioridade pendente. |
| Notificação | Como uma ativação se anuncia além do indicador sempre presente da barra de status. | Fixa (padrão), Temporizada, Barra de status. A dica do campo: "Como uma ativação se anuncia: Fixa = tarja até ser reconhecida ou voltar ao normal; Temporizada = tarja por alguns segundos; Barra de status = apenas o indicador na barra de status." | Veja Anunciação. |
| Atraso para ligar (ms) | Quanto tempo a condição precisa continuar verdadeira antes de o alarme subir. | Um inteiro não negativo; 0 sobe na hora. | Tempo observado sustentado, na resolução da varredura de 100 ms. |
| Atraso para desligar (ms) | Quanto tempo a condição precisa continuar falsa antes de o alarme normalizar. | Um inteiro não negativo; 0 normaliza na hora. | A mesma resolução. |
| Mensagem (mostrada enquanto ativo, opcional) | Texto levado pela anunciação. | Texto livre, vazio. | O cartão e a notificação do sistema mostram "`<Message>` (Prioridade)"; sem ela, "Há um alarme de prioridade `<Priority>` ativo." |
| Exige reconhecimento: um alarme normalizado fica retido até o operador reconhecer | Se uma ativação exige uma resposta. | Ligado por padrão. | Desligado: o alarme sobe direto para Ativo, reconhecido e normaliza direto para Sem alarme; ele se anuncia, mas nunca fica retido e nunca espera. |

Um atraso negativo ou não interpretável mantém o valor guardado e mostra "Os atrasos precisam ser inteiros não negativos (ms; a resolução é a varredura de 100 ms)." Um atraso é tempo **observado** sustentado: enquanto a condição não pode ser avaliada, os dois relógios de atraso recomeçam, então uma janela cega nunca é creditada para subir nem para normalizar.

Salvar uma mudança na condição, num atraso, no Exige reconhecimento ou no Habilitado devolve a máquina para Sem alarme (um estado velho de outra regra mentiria); a reposição é registrada no diário com a origem Configuração e fecha o cartão de tarja do alarme. Mudar o nome, a descrição, a prioridade, a mensagem ou a notificação, ou rearquivar o alarme em outra pasta, preserva o estado.

## O trilho Estado {#the-state-rail}

O ESTADO mostra o estado atual em palavras, "Prioridade: `<priority>`", **Ativo desde** (um traço enquanto a condição não está presente) e **Última transição** (um traço antes da primeira mudança de estado), e a nota "Cada transição aparece na página Eventos e no histórico permanente de Alarmes. O estado do alarme mora no espaço de endereços, por exemplo Alarms.X.IsActive em uma expressão ou em um script." O painel da raiz Alarms lista todo alarme com "`<estado>` · `<prioridade>` · desde `<quando>`" na coluna Valor dele e um botão **Reconhecer** por linha.

## A máquina de estados {#the-state-machine}

| Estado | Significado |
| --- | --- |
| Sem alarme | Condição falsa, nada pendente. |
| Ativo, não reconhecido | Condição verdadeira, ainda sem reconhecimento. |
| Ativo, reconhecido | Condição verdadeira, reconhecida (ou o alarme nunca exige reconhecimento). |
| Normalizado, não reconhecido | A condição voltou ao normal enquanto ninguém tinha reconhecido: fica retido até o operador reconhecer. |

Uma condição que continua verdadeira ao longo do atraso para ligar sobe o alarme de Sem alarme ou de Normalizado, não reconhecido para Ativo, não reconhecido (direto para Ativo, reconhecido quando o Exige reconhecimento está desligado). Uma condição que continua falsa ao longo do atraso para desligar o normaliza: para Sem alarme quando já estava reconhecido, e para Normalizado, não reconhecido quando não estava. Reconhecer leva de Ativo, não reconhecido para Ativo, reconhecido e solta a retenção de volta para Sem alarme. A varredura avalia primeiro as variáveis e depois os alarmes, a cada 100 ms, na fila da lógica. O estado do alarme vive em memória: depois de um reinício, toda máquina começa em Sem alarme e a primeira varredura re-deriva a realidade a partir das condições ao vivo, então uma retenção ou um reconhecimento pendente não sobrevive a um reinício. Toda transição, seja qual for a origem dela (a varredura, um reconhecimento, uma reposição ao salvar, desabilitar ou excluir), é registrada no diário e gravada no histórico durável de alarmes da página [Eventos](events-alarms).

## Anunciação {#annunciation}

A barra de status do shell sempre leva a contagem e a pior severidade pendente ([a janela](app-window)). Além dela, o tipo de Notificação decide:

| Notificação | Comportamento |
| --- | --- |
| Fixa | Um cartão de tarja ao subir, com o nome do alarme no título e a cor da prioridade (Crítica como erro, Alta e Média como avisos, Baixa como informação), levando **Reconhecer** enquanto não estiver reconhecido e **Abrir os alarmes**. Ele fica até o alarme ser reconhecido ou voltar a Sem alarme; a retenção de Normalizado, não reconhecido o mantém na tela, e uma nova subida o substitui. |
| Temporizada | O mesmo cartão, dispensado sozinho depois de 8 segundos. |
| Barra de status | Nenhum cartão e nenhuma notificação do sistema; apenas o indicador da barra de status. |

Dispensar um cartão à mão não é um reconhecimento. Enquanto a janela está escondida na área de notificação ou minimizada, uma ativação Fixa ou Temporizada também levanta uma notificação do sistema com o mesmo texto.

## Reconhecer {#acknowledging}

Reconhecer é um comando de operação e acontece onde quer que o alarme te encontre: o verbo **Reconhecer** sobre um alarme aberto, o **Reconhecer tudo** sobre a raiz Alarms, o botão **Reconhecer** de cada linha do painel da raiz Alarms, o **Reconhecer** do menu de contexto de uma linha de alarme, o **Reconhecer** do cartão de tarja, a página [Eventos](events-alarms), um [Aviso de alarme](component-alarm-banner) num dashboard, e o agente (registrado como MCP). Todo reconhecimento pega a fila da lógica, é registrado no diário com a origem dele e fecha o cartão do alarme.

Onde quer que apareça, a resposta só é oferecida onde há uma a dar. Um alarme que está em Sem alarme ou já reconhecido mantém o verbo no lugar, esmaecido, dizendo "Este alarme não está esperando resposta."; o **Reconhecer tudo** sobre um registro sem nada pendente diz "Nenhum alarme está esperando resposta.". E o feed confirma só o que se moveu: pressionar uma resposta que não muda nada relata a mesma frase, nunca "Reconhecido.", porque um log de estação que registra um ato de operador que ninguém fez é pior do que um verbo brevemente fora de alcance.

| Comando | O que faz | Esmaecido quando | Não aparece quando |
| --- | --- | --- | --- |
| Reconhecer | Reconhece o alarme aberto; o feed diz "Reconhecido." | "Este alarme não está esperando resposta." quando ele está em Sem alarme ou já reconhecido; "Runtime parado" enquanto está em somente leitura. | O papel não tem Operar a lógica. |
| Reconhecer tudo | Reconhece todo alarme com algo pendente, num item de fila só; o feed diz "Todos os alarmes reconhecidos." | "Nenhum alarme está esperando resposta." quando nada está pendente; "Runtime parado" enquanto está em somente leitura. | O papel não tem Operar a lógica. |
| Habilitar / Desabilitar | Vira o Habilitado; desabilitar devolve a máquina para Sem alarme e para a avaliação. | A estação está travada ou em somente leitura. | O papel não tem Configurar a lógica. |
| Copiar | Duplica o alarme na raiz Alarms, com um nome livre, e destaca a cópia na tabela dessa raiz em vez de abri-la ([Criar e copiar](logic#creating-and-copying)); a cópia começa em Sem alarme. | A estação está travada ou em somente leitura. | O papel não tem Configurar a lógica. |
| Excluir o alarme | Pergunta "Excluir 'X'? Isso remove o alarme. Isso não pode ser desfeito.", repõe a máquina primeiro (para que uma anunciação nunca sobreviva ao alarme dela) e o remove; as referências a `Alarms.X` ficam sem resolução. | A estação está travada ou em somente leitura. | O papel não tem Configurar a lógica. |

## Usada por {#used-by}

O cartão USADA POR, no pé da coluna do formulário, lista tudo na estação que lê o alarme, para você ver o que depende dele antes de renomeá-lo ou excluí-lo. Ele é lido quando você seleciona o alarme e de novo depois de uma renomeação.

| Tipo | Local | Nome |
| --- | --- | --- |
| Servidor Modbus | Vazio | A linha do mapa de registradores do [servidor Modbus](connector-modbus-server) que serve um dos estados do alarme, pela classe de registrador e pelo registrador (`Coil 0`) |
| Servidor OPC UA | Vazio | A linha dos [nós servidos](connector-opcua-served-nodes) do servidor OPC UA que serve o alarme: sempre Somente leitura |
| Publicação MQTT | O broker | O tópico da linha do [cartão Publicar](driver-mqtt#the-publish-card) do broker que publica o alarme |
| Variável, Ação | Vazio | A variável de expressão ou a ação cujo texto lê um dos membros do alarme (`Alarms.HighLevel.IsActive`), com as pastas em que está arquivada |
| Dashboard | O dashboard | O componente cuja propriedade de endereço nomeia o alarme |

Uma condição nunca lê outro alarme, então nenhum alarme é listado. A linha de um servidor guarda o alarme pela identidade estável dele: uma renomeação a deixa servindo o mesmo alarme, e uma exclusão deixa a linha de pé, nomeando o que ela perdeu. A linha de um broker faz o mesmo e mantém o tópico. Enquanto a busca corre, o cartão diz "Lendo as referências…"; quando nada usa o alarme, "Nada na estação usa este alarme."; quando a busca falha, "Não foi possível ler as referências" com **Tentar de novo**, nunca uma lista vazia. O cartão só lê: todo papel que abre o editor o vê, também enquanto a estação está bloqueada, e ele não oferece comando nenhum.

## O que os alarmes não fazem {#what-alarms-do-not-do}

Nenhuma histerese ou banda morta além do que a condição expressa, nenhuma inibição temporária, nenhum som, nenhum reconhecimento por script, nenhum estado persistido entre reinícios, e nenhuma avaliação enquanto o alarme está desabilitado ou o runtime parado. Um alarme não é uma ocorrência do Process: essas são configuradas e julgadas na página [Process](process-occurrences).
