# Exemplo de configuração de fluxo

Este exemplo demonstra como configurar um fluxo que coleta dados de dispositivos IoT, realiza cálculos para derivar métricas relevantes para o negócio e encaminha os dados enriquecidos para um sistema externo. O exemplo usa um padrão de fluxo linear que pode ser adaptado a vários casos de uso da indústria.

## Cenário de negócio

Neste cenário, uma organização implantou rastreadores IoT em seus ativos e precisa processar dados desses dispositivos para análises de negócios. A organização recebe os seguintes parâmetros diretamente de seus dispositivos de rastreamento:

* `speed`: Velocidade do veículo em quilômetros por hora
* `temperature`: Temperatura ambiental em Celsius
* `odometer`: Distância percorrida em quilômetros
* `ignition`: Estado da ignição do motor (1 = ligado, 0 = desligado)
* `fuel_level`: Medição atual do nível de combustível
* `pressure_psi`: Leitura de pressão em PSI
* `voltage`: Tensão da bateria em volts
* `throttle`: Posição do pedal do acelerador via barramento CAN (0-255)
* `fuel_level_1`: Medição do nível do primeiro tanque de combustível
* `fuel_level_2`: Medição do nível do segundo tanque de combustível

A organização precisa:

1. Coletar dados telemétricos brutos dos dispositivos para manter um registro completo das operações dos ativos
2. Converter unidades de medição para corresponder ao seu formato padrão de relatórios (unidades imperiais) para consistência com os sistemas de negócios existentes
3. Calcular métricas baseadas no tempo que indiquem padrões de uso para otimizar a utilização dos ativos e cronogramas de manutenção
4. Criar métricas derivadas para gerar insights operacionais não fornecidos diretamente pelo hardware
5. Encaminhar os dados enriquecidos para um sistema externo de análise para integração com plataformas de business intelligence
6. Enviar os dados brutos inalterados para Navixy para monitoramento

Este fluxo transformará os dados brutos do dispositivo em um formato que apoia diretamente a tomada de decisão empresarial, mantendo a integridade das medições originais.

## Etapas de configuração do fluxo

Siga estas etapas para construir um fluxo abrangente de transformação e encaminhamento de dados:

{% stepper %}
{% step %}

### **Criar um novo fluxo**

1. Clique no **Novo fluxo** botão no topo da interface IoT Logic
2. Digite *Asset Telemetry Processing* como nome do fluxo
3. Adicione uma descrição: "*Coleta dados do dispositivo, calcula métricas derivadas e encaminha para a plataforma de análises.*"
4. Certifique-se de que o **Fluxo habilitado** interruptor esteja ativado
5. Clique em **Salvar** para criar o fluxo

<figure><img src="https://2540041085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-d2a74f7968dab62f5634e7a048a9fda7bd93b8bb%2Fimage-20250407-200203.png?alt=media" alt="Create flow dialog with filled-in name and description, Flow enabled toggle on"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Configurar a fonte de dados**

1. Arraste um **Data Source** nó do menu esquerdo para a área de trabalho
2. Clique duas vezes no nó para abrir seu painel de configuração
3. Na seção **Nome do nó** digite *Asset Trackers*
4. Selecione os dispositivos a incluir neste fluxo a partir da lista filtrada

* Para este exemplo, selecione pelo menos dois dispositivos com capacidades semelhantes

5. Clique em **Aplicar** para salvar a configuração do nó

<figure><img src="https://2540041085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-5d3308c8c7e9a9bd01f1a090ba8c14cd33b6e2b1%2Fimage-20250407-200511.png?alt=media" alt="Data source node configuration with selected devices" width="375"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Configurar transformações de dados básicas**

1. Arraste um **Initiate Attribute** nó do menu esquerdo para a área de trabalho
2. Conecte o **Data Source** nó a este **Initiate Attribute** nó
3. Clique duas vezes no nó para abrir sua configuração
4. Na seção **Nome do nó** digite *Conversões de unidade*
5. Crie os seguintes atributos para conversão de unidades (todos os exemplos usam sintaxe curta, referindo-se aos valores mais recentes do atributo sem verificação de validade):
   1. Adicione um novo atributo para conversão de velocidade (km/h para mph): 1. Nome do atributo: *speed\_mph* 2. Valor: `speed/1.609`
   2. Adicione um novo atributo para conversão de temperatura (Celsius para Fahrenheit): 1. Nome do atributo: *temperature\_F* 2. Valor: `temperature*1.8 + 32`
   3. Adicione um novo atributo para conversão de distância (quilômetros para milhas): 1. Nome do atributo: *distance\_miles* 2. Valor: `odometer/1.609`
   4. Adicione um novo atributo para conversão de pressão (PSI para Bar): 1. Nome do atributo: *pressure\_bar* 2. Valor: `pressure_psi * 0.06895`
6. Clique em **Aplicar** para salvar a configuração do nó

<figure><img src="https://2540041085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-e88dbb7ac084cc181b9a1344644c350ac263a398%2Fimage-20250407-201226.png?alt=media" alt="First Initiate attribute node showing the unit conversion attributes"><figcaption></figcaption></figure>

{% hint style="info" %}
Para explicações sobre os cálculos apresentados nesta etapa, veja [Conversões básicas de unidade](#basic-unit-conversions)
{% endhint %}
{% endstep %}

{% step %}

### **Criar métricas calculadas avançadas**

1. Arraste outro **Initiate Attribute** nó do menu esquerdo para a área de trabalho
2. Conecte o primeiro **Initiate Attribute** nó a este novo
3. Clique duas vezes no nó para abrir sua configuração
4. Na seção **Nome do nó** digite *Cálculos avançados*
5. Crie os seguintes atributos para métricas avançadas:
   1. Adicione um atributo para detecção de variação de temperatura:
      1. Nome do atributo: *temperature\_change*
      2. Valor: `value('temperature', 0, 'valid') - value('temperature', 1, 'valid')`&#x20;
      3. `genTime('temperature', 0, 'valid')`
   2. Adicione um atributo para encontrar o tempo decorrido entre as duas últimas leituras:&#x20;
      1. &#x20;Nome do atributo: *time\_between\_readings\_ms*&#x20;
      2. Valor: `srvTime('speed', 0, 'valid') - srvTime('speed', 1, 'valid')`&#x20;
      3. Tempo de geração: `genTime('speed', 0, 'valid')`
   3. Adicione um atributo para arredondar a temperatura para o inteiro mais próximo:
      1. Nome do atributo: *temperature\_rounded*&#x20;
      2. Valor: `math:round(value('temperature', 0, 'valid'))`
   4. Adicione um atributo para cálculo de valor padronizado (normalizando nível de combustível para 0-100%):&#x20;
      1. Nome do atributo: *fuel\_level\_percent*&#x20;
      2. Valor: `(value('fuel_level', 0, 'valid') - 0) / (100 - 0) * 100`
   5. Adicione um atributo para cálculo de porcentagem de carga da bateria:&#x20;
      1. Nome do atributo: *battery\_percentage*&#x20;
      2. Valor: `(value('voltage', 0, 'valid') - 11) / (14 - 11) * 100`
   6. Adicione um atributo para cálculo da posição do acelerador:&#x20;
      1. Nome do atributo: *throttle\_percentage*&#x20;
      2. Valor: `value('throttle', 0, 'valid') / 255 * 100`
   7. Adicione um atributo para média do nível de combustível a partir de múltiplos sensores:&#x20;
      1. Nome do atributo: *avg\_fuel\_level*&#x20;
      2. Valor: `(value('fuel_level_1', 0, 'valid') + value('fuel_level_2', 0, 'valid')) / 2`
6. Clique em **Aplicar** para salvar a configuração do nó

<figure><img src="https://2540041085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-bec2e2d25385ec3b81e31fd2f78da9fab2e3f1b8%2Fimage-20250407-202303.png?alt=media" alt="Second Initiate attribute node showing the advanced calculated metrics"><figcaption></figcaption></figure>

{% hint style="info" %}
Para explicações sobre os cálculos apresentados nesta etapa, veja [Cálculos de métricas avançadas](#advanced-metrics-calculations).
{% endhint %}
{% endstep %}

{% step %}

### **Configurar o endpoint de saída**

1. Arraste um **Ponto de Saída (Output Endpoint)** nó do menu esquerdo para a área de trabalho
2. Conecte o segundo **Initiate Attribute** nó a este **Ponto de Saída (Output Endpoint)** nó
3. Clique no nó para abrir sua configuração
4. Configure as seguintes opções:
   1. **Tipo de endpoint**: *Endpoint MQTT*
   2. **Nome do endpoint**: *Analytics Platform*
   3. **Protocolo**: padrão *Navixy Generic Protocol (JSON)*
   4. **IP/Domínio**: Insira o endereço do sistema de destino (por exemplo, "*analytics.example.com*")
   5. **Porta**: *8883* (padrão para MQTT, você pode deixar vazio)
   6. **Habilitar SSL**: *ativar o interruptor*
   7. **Versão MQTT**: *5.0*
   8. **ID do Cliente MQTT**: *asset-telemetry-client*
   9. **Tópico**: *telemetry/assets/raw*
   10. **QoS**: *1*
   11. **Autenticação MQTT**: *Sim* (se exigido pelo seu sistema de destino)
   12. **Login e senha MQTT**: Insira as credenciais, se aplicável
5. Clique em **Crie** para salvar a configuração do nó

<figure><img src="https://2540041085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-5bba126378b9c39ca8546d7caf4630e800855eb1%2Fimage-20250407-202704.png?alt=media" alt="Output endpoint node configuration with filled-in connection settings" width="375"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Adicionar endpoint de Saída Padrão**

1. Arraste um **Ponto de Saída (Output Endpoint)** nó do menu esquerdo para a área de trabalho
2. Na seção **Tipo de endpoint** selecionar **Endpoint Padrão**
3. Clique em **Salvar** para aplicar a configuração do nó
4. Conecte o *Asset Trackers* (**Data Source**) nó a ele

Isso garante que os dados brutos sejam enviados para Navixy diretamente a partir dos dispositivos, sem transformações ou enriquecimentos.
{% endstep %}

{% step %}

### **Salvar e testar o fluxo**

Sua configuração final ficará assim:

<figure><img src="https://2540041085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-1602478802bdfdba0a251ec29eaf677ef6562456%2Fimage-20250407-203757.png?alt=media" alt="Complete flow configuration with all nodes connected in IoT Logic workspace"><figcaption></figcaption></figure>

Clique no **Salvar fluxo** botão no **painel Nós** para armazenar a configuração do seu fluxo.
{% endstep %}
{% endstepper %}

{% hint style="success" %}
Use [Data Stream Analyzer (DSA)](https://www.navixy.com/docs/user/pt-br/guide/account/iot-logic/data-stream-analyzer) para monitorar os dados recebidos e verificar:

* Os dispositivos estão enviando dados para o fluxo
* Os cálculos estão funcionando conforme esperado
* Os dados estão sendo encaminhados para o destino Por exemplo, verifiquemos se as conversões de velocidade são calculadas corretamente em um caminhão. Para fazer isso no DSA, selecione o **Volvo** dispositivo e atributos **speed** e na **speed\_mph**:\ <img src="https://2540041085-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-dd91833c4e91cbf04798d44c3604cd4ef38c0937%2Fimage-20250407-204530.png?alt=media" alt="Speed attributes for one device in Data Stream Analyzer" data-size="original">

Tudo certo! Os dados foram recebidos e convertidos com sucesso.
{% endhint %}

## Transformações de dados explicadas

Vamos examinar os principais cálculos usados neste fluxo.

### Conversões básicas de unidade

O primeiro **Iniciar nó de atributo** realiza conversões de unidade diretas:

* **Velocidade**: Converte km/h para mph dividindo por 1.609
* **Temperatura**: Converte Celsius para Fahrenheit usando a fórmula °F = °C × 1.8 + 32
* **Distância**: Converte quilômetros para milhas dividindo por 1.609
* **Pressão**: Converte PSI para Bar multiplicando por 0.06895, tornando-o compatível com os padrões internacionais de medição de pressão

Essas conversões garantem consistência com formatos de relatório padrão e tornam os dados imediatamente utilizáveis para análise. Conversões de unidade são particularmente valiosas para organizações multinacionais que operam em regiões com diferentes padrões de medição.

### Cálculos de métricas avançadas

O segundo **Iniciar nó de atributo** realiza cálculos mais complexos:

* **Detecção de variação de temperatura**: Calcula a diferença entre as leituras de temperatura atual e anterior para identificar mudanças súbitas. Isso ajuda a detectar problemas em equipamentos, como falhas de refrigeração em veículos de transporte ou problemas de HVAC em instalações. Por exemplo, uma elevação súbita de 5°C em um contêiner refrigerado pode indicar uma falha no sistema de refrigeração exigindo atenção imediata.
  * **Hora de geração**: Usar `genTime('temperature', 0, 'valid')` é crucial aqui porque preserva o carimbo de data/hora exato quando a leitura de temperatura foi gerada pelo dispositivo, garantindo uma análise temporal precisa das variações de temperatura.
  * **Hora do servidor**: O valor padrão `now()` captura automaticamente quando o servidor recebeu os dados. Como não precisamos modificar esse carimbo de data/hora, podemos deixar este campo vazio durante a configuração.
* **Tempo entre leituras**: Mede o intervalo entre transmissões de dados consecutivas ao comparar carimbos de data/hora do servidor. Esse cálculo ajuda a identificar problemas de comunicação ou validar que os dispositivos estão relatando nas frequências esperadas. Intervalos irregulares podem indicar problemas de conectividade, enquanto atrasos consistentes podem sugerir congestionamento de rede ou problemas de configuração do dispositivo.
* **Arredondamento de valores**: Aplica arredondamento matemático às leituras de temperatura, reduzindo a precisão decimal para inteiros. Isso simplifica a visualização e relatórios dos dados enquanto reduz os requisitos de armazenamento para dados históricos. Valores arredondados são especialmente úteis para exibições em dashboards e alertas baseados em limites onde a precisão decimal não é necessária.
  * **Hora de geração**: Especificar `genTime('speed', 0, 'valid')` conecta esses metadados diretamente ao carimbo de data/hora da leitura original, tornando possível analisar tanto o intervalo de tempo quanto quando ele ocorreu.
  * **Hora do servidor**: O valor padrão `now()` captura automaticamente quando o servidor recebeu os dados. Como não precisamos modificar esse carimbo de data/hora, podemos deixar este campo vazio durante a configuração.
* **Cálculo de valor padronizado**: Normaliza leituras brutas de sensores para uma escala percentual (0-100%). Essa padronização facilita a comparação de leituras entre diferentes tipos de sensores e modelos de veículos. Para gerenciamento de frotas, isso permite relatórios consistentes de nível de combustível independentemente da implementação específica do sensor em cada modelo de veículo, possibilitando alertas uniformes de baixo nível de combustível e análises de consumo.
* **Cálculo da porcentagem de carga da bateria**: Normaliza leituras de tensão da bateria (faixa 11V-14V) para uma escala de 0-100% para monitoramento mais simples. Por exemplo, uma leitura de 12,5V seria normalizada para 50%, fornecendo um indicador intuitivo da saúde da bateria entre diferentes tipos de veículos.
* **Cálculo da posição do acelerador**: Converte dados brutos de posição do acelerador (faixa 0-255) do barramento CAN do veículo para uma escala percentual. Essa padronização ajuda os operadores a entenderem rapidamente o comportamento do motorista e o desempenho do veículo sem precisar interpretar valores brutos do sensor.
* **Média do nível de combustível de múltiplos sensores**: Combina leituras de dois sensores de combustível separados para produzir uma medição global do nível de combustível mais precisa. Isso é particularmente valioso para veículos com formatos de tanque complexos ou múltiplos tanques, onde um único sensor pode não fornecer leituras confiáveis devido ao deslocamento de combustível durante o movimento.

## Resumo do fluxo de exemplo

Esta configuração de fluxo demonstra várias capacidades principais do IoT Logic:

1. **Padronização**: Converte leituras específicas do dispositivo em métricas de negócio padronizadas
2. **Enriquecimento**: Cria novas métricas significativas não disponíveis diretamente dos sensores do dispositivo
3. **Transformação**: Altera unidades para corresponder aos requisitos de relatório empresarial
4. **Contexto histórico**: Usa leituras anteriores para calcular métricas baseadas em tendência
5. **Determinação de status**: Cria valores categóricos com base em múltiplas entradas de sensores

Essa combinação de capacidades transforma dados brutos de dispositivos em inteligência de negócio acionável, apoiando diretamente a tomada de decisões operacionais enquanto mantém a integridade das medições originais.
