Fale Comigo
Menu

Blog · Integrações e operação

Do orçamento à rua: quando o sistema passa a aprender com o veículo

No Pet Táxi, boa parte de uma operação começa antes de o veículo se movimentar. O sistema já conhece o cliente, os animais envolvidos, o veículo previsto, a distância estimada, os horários, os destinos, a composição comercial e parte importante da estrutura de custos. Tudo isso descreve aquilo que pretendemos executar. Agora estamos estudando como fazer essa representação conversar com aquilo que efetivamente acontece com o veículo na rua.

Existe uma segunda realidade que nasce somente quando o veículo entra em movimento: quanto ele efetivamente percorreu, quando começou a se deslocar, quanto tempo levou, qual odômetro foi observado, onde iniciou e onde terminou determinado percurso.

Estamos estudando a integração da solução de telemetria da frota, contratada por meio da Localiza/Mobi7, ao sistema próprio do Pet Táxi.

O objetivo não é simplesmente colocar um ponto em um mapa. É construir uma ligação entre o que foi planejado comercial e operacionalmente e as evidências produzidas pela execução física.

Telemetria produz fatos sobre o veículo. O sistema do Pet Táxi é que pode transformar esses fatos em contexto operacional.

Importante

A integração descrita neste artigo está em estudo. Os blocos de código são exemplos conceituais de arquitetura e não representam uma implementação já implantada em produção.

O sistema conhece a intenção. A telemetria registra o que aconteceu com o veículo.

Quando um orçamento é elaborado, trabalhamos com uma expectativa. Existe uma distância prevista, uma janela de horário, determinado veículo e um destino conhecido. Quando o veículo efetivamente circula, outra camada de informação passa a existir.

O sistema pode conhecer antes da operação A telemetria pode observar durante ou depois
Veículo previsto Veículo monitorado
Distância prevista Distância percorrida
Início previsto Horário observado
Término previsto Duração observada
Origem e destino pretendidos Posições efetivamente registradas
Quilometragem utilizada nos cálculos Odômetro observado
Plano de manutenção Uso acumulado do veículo

Essas duas colunas não competem entre si. Elas descrevem dimensões diferentes da mesma operação.

Um orçamento pode dizer que determinado atendimento deverá consumir 24 quilômetros. A telemetria pode posteriormente registrar um percurso de 26 quilômetros. Nenhuma dessas informações, isoladamente, explica tudo.

A primeira representa planejamento. A segunda representa evidência física. A parte realmente interessante começa quando conseguimos relacioná-las.

Integrar não significa simplesmente importar campos

É tentador imaginar uma integração como uma sequência simples: API → banco de dados → tela.

Na prática, esse costuma ser apenas o começo. Uma fonte externa possui seus próprios identificadores para veículos, motoristas e eventos. Nosso sistema possui sua própria representação da frota e da operação.

A primeira preocupação, portanto, não é copiar informação. É saber a que informação interna determinado dado externo pertence.

Um veículo é um bom exemplo. Nosso cadastro já conhece placa, identificação documental, características técnicas, situação operacional e outras propriedades. A fonte de telemetria possui sua própria identidade para aquele mesmo veículo.

Não faria sentido substituir uma pela outra. O melhor cenário é preservar as duas.

Trecho 01 · arquitetura em estudo — identidade externa sem substituir o cadastro interno
$veiculoInterno = $veiculos->localizarPorPlaca($dadosExternos->placa);

if ($veiculoInterno === null) {
    throw new VeiculoNaoIdentificado();
}

$vinculoTelemetria = new VinculoTelemetria(
    veiculoId: $veiculoInterno->id(),
    origem: 'mobi7',
    identificadorExterno: $dadosExternos->id
);

$vinculos->salvar($vinculoTelemetria);

O trecho é conceitual, não uma implementação atualmente em produção. Mas ele demonstra uma decisão arquitetural importante: o sistema interno continua responsável por saber o que é um veículo para o Pet Táxi.

O identificador externo funciona como ligação com outra fonte de informação. Essa separação evita transformar a arquitetura interna em uma cópia do fornecedor utilizado naquele momento.

Uma camada própria entre o sistema e a telemetria

Esse cuidado pode ir além. Em vez de permitir que diferentes partes do sistema conheçam diretamente a forma específica como determinada API entrega seus dados, podemos criar uma representação interna.

Assim, o restante da aplicação não precisa perguntar “como a Mobi7 chama essa informação?”. Precisa perguntar “o que um percurso significa para nós?”.

Trecho 02 · arquitetura em estudo — uma interface própria para telemetria
interface FonteTelemetria
{
    public function percursos(
        Veiculo $veiculo,
        DateTimeImmutable $inicio,
        DateTimeImmutable $fim
    ): iterable;

    public function ultimaLeitura(Veiculo $veiculo): ?LeituraTelemetria;
}
final class Mobi7Telemetria implements FonteTelemetria
{
    public function percursos(
        Veiculo $veiculo,
        DateTimeImmutable $inicio,
        DateTimeImmutable $fim
    ): iterable {
        // Consulta a fonte externa e traduz
        // o resultado para conceitos internos.
    }
}

Não há endpoint, chave, credencial ou estrutura privada da API expostos nesse exemplo. O objetivo é mostrar o princípio de projeto: o sistema continua falando a linguagem da operação, mesmo quando se comunica com sistemas que falam outra linguagem.

Percurso não é atendimento

Talvez essa seja uma das distinções mais importantes de todo o projeto.

A telemetria pode registrar que determinado veículo saiu de um ponto, percorreu determinada distância e chegou a outro ponto. Mas isso não significa que ela saiba por que isso aconteceu.

Ela não conhece necessariamente o animal transportado, o cliente, o orçamento, a finalidade do serviço, as particularidades daquele destino ou a decisão comercial por trás daquele deslocamento.

Fato observado O que não pode ser presumido automaticamente
Veículo percorreu 18 km Esses 18 km pertencem integralmente a um atendimento
Veículo chegou próximo a um endereço O serviço foi concluído
Veículo permaneceu parado Houve espera operacional
Veículo iniciou um deslocamento A operação começou naquele instante
Há uma identificação de motorista Essa pessoa é necessariamente responsável pelo atendimento
O veículo mudou de posição Existe um novo serviço

O veículo pode sair para abastecer. Pode ir para manutenção. Pode deslocar-se até o primeiro cliente antes de começar um atendimento. Pode fazer um retorno operacional. Pode existir mais de um animal ou mais de um destino dentro de uma mesma operação.

O GPS vê deslocamento. O domínio do Pet Táxi precisa determinar significado.

A integração também revela o que ainda precisamos modelar

Esse estudo já produziu um resultado interessante antes mesmo da integração estar pronta.

Ao analisar o sistema existente, percebemos que existe uma estrutura rica para orçamento, veículos, abastecimentos, custos e manutenção, mas ainda não uma entidade operacional completa que represente explicitamente um deslocamento realizado ou um atendimento executado.

Isso é importante. Uma integração externa não serve apenas para trazer novos dados. Às vezes ela revela conceitos que ainda não precisaram existir formalmente dentro do sistema.

Conceito Pergunta que ele responde
Orçamento O que propusemos fazer?
Atendimento O que estamos executando para o cliente?
Deslocamento Que movimento físico do veículo ocorreu?
Percurso observado O que a telemetria registrou?
Destino Onde e em que contexto operacional isso acontece?
Motorista Quem conduziu o veículo naquele período?

Essa diferença é típica de sistemas que amadurecem com a operação. Não criamos entidades porque parecem tecnicamente elegantes. Criamos quando uma distinção começa a mudar decisões.

Distância prevista versus distância realizada

Aqui aparece uma das possibilidades mais evidentes. Nosso sistema já trabalha com distância prevista durante a elaboração comercial. A telemetria acrescenta a possibilidade de conhecermos a distância observada no deslocamento.

Imagine um exemplo fictício:

Informação Planejado Observado
Distância 18,6 km 20,1 km
Duração 42 min 49 min
Veículo Veículo A Veículo A
Destino Clínica X Região correspondente ao destino

Exemplo meramente ilustrativo. Os valores não representam uma operação real do Pet Táxi.

Uma diferença de 1,5 quilômetro isoladamente não diz muita coisa. Mas cem operações semelhantes podem dizer.

Talvez determinada região apresente sistematicamente diferença entre a distância utilizada na estimativa e a distância efetivamente percorrida. Talvez determinado destino possua particularidades de acesso. Talvez determinado horário produza outro comportamento.

É nesse momento que a telemetria deixa de responder apenas “quanto o carro andou?” e começa a ajudar a responder “nossas premissas continuam representando a realidade?”.

Trecho 03 · arquitetura em estudo — comparação sem alterar automaticamente o orçamento
$comparacao = [
    'distancia_prevista'  => $orcamento->distanciaPrevistaKm(),
    'distancia_observada' => $percurso->distanciaKm(),
];

$comparacao['diferenca_km'] =
    $comparacao['distancia_observada']
    - $comparacao['distancia_prevista'];

$comparacao['variacao_percentual'] =
    $comparacao['distancia_prevista'] > 0
        ? ($comparacao['diferenca_km']
            / $comparacao['distancia_prevista']) * 100
        : null;

A intenção aqui não seria alterar retroativamente aquilo que foi contratado pelo cliente. Dado operacional não precisa virar cobrança automática.

Ele pode servir primeiro para análise. Se determinado padrão de diferença se repetir, a regra de formação de preço pode ser revista para os próximos orçamentos.

Isso é muito diferente de transformar telemetria em taxímetro.

Preço, custo previsto e custo observado são coisas diferentes

Essa distinção merece atenção especial. O preço cobrado de um cliente é resultado de uma decisão comercial. O custo representa outra coisa.

Se uma operação prevista para 20 quilômetros terminou consumindo 23 quilômetros, isso não significa necessariamente que o cliente deva pagar três quilômetros adicionais. Mas os três quilômetros aconteceram. Economicamente, eles existem.

Dimensão Significado
Preço comercial O que foi apresentado e contratado
Custo previsto O que imaginávamos consumir para executar
Custo observado O que os dados reais ajudam a demonstrar depois

Essa separação protege a lógica comercial e, ao mesmo tempo, melhora a capacidade gerencial. Um sistema mais maduro não precisa escolher entre orçamento e realidade. Ele pode preservar os dois.

Tempo previsto também pode ser confrontado com tempo observado

Distância é apenas uma dimensão. Tempo é outra.

Uma operação planejada pode possuir início e término estimados. A telemetria acrescenta marcas temporais ligadas ao movimento real do veículo.

Com isso, ao longo do tempo, podemos estudar perguntas como:

  • determinadas regiões exigem mais tempo do que estimamos?
  • determinado horário produz atrasos recorrentes?
  • determinado destino costuma gerar permanência maior?
  • quanto tempo de uma operação é deslocamento e quanto é espera?
  • nossas janelas continuam adequadas?

Novamente, a diferença entre uma ocorrência e um padrão é fundamental. Um congestionamento excepcional ensina pouco. Cinquenta atendimentos semelhantes apresentando o mesmo comportamento ensinam bastante.

É assim que dados históricos deixam de ser arquivo morto e passam a funcionar como mecanismo de aprendizado.

O odômetro ganha uma segunda testemunha

Existe outro encontro particularmente interessante entre os sistemas.

Hoje, quilometragem já possui significado em diferentes partes da operação. Ela pode estar presente no cadastro do veículo, em registros de abastecimento, em locações, em cálculos de custo e em outras análises.

A telemetria acrescenta uma nova fonte. Isso não significa que a nova fonte precise substituir imediatamente todas as demais. Significa que elas podem ser confrontadas.

Fonte Natureza
Odômetro informado em abastecimento Registro manual ligado a um evento operacional
Odômetro do cadastro Referência administrativa
Distância de orçamento Planejamento
Distância entre abastecimentos Derivação gerencial
Odômetro de telemetria Observação externa
Distância de percurso Observação de deslocamento

Essa arquitetura é mais interessante do que simplesmente decretar: “a API é a verdade”.

Sistemas reais precisam conviver com diferenças. Equipamentos podem possuir critérios diferentes de medição. Informações manuais podem conter erro. Um evento pode chegar atrasado. Uma leitura pode não estar disponível.

Em vez de escolher silenciosamente um vencedor, o sistema pode registrar a origem das informações e detectar divergências.

Trecho 04 · arquitetura em estudo — conciliação de odômetro
$odometroInformado = $abastecimento->odometroKm();
$odometroObservado = $telemetria->odometroKm();

$diferenca = abs($odometroInformado - $odometroObservado);

if ($diferenca > $toleranciaKm) {
    $pendencias->registrar(
        tipo: 'DIVERGENCIA_ODOMETRO',
        veiculo: $veiculo,
        informado: $odometroInformado,
        observado: $odometroObservado
    );
}

O sistema não corrige automaticamente o abastecimento. Ele detecta algo que merece atenção.

Automação madura não é aquela que decide tudo sozinha. É aquela que sabe quando possui informação suficiente para decidir e quando deve apenas chamar atenção para uma divergência.

Abastecimento passa a conversar com deslocamento

Essa possibilidade também pode aprofundar uma estrutura que já existe. Quando um abastecimento possui data, hora, veículo e odômetro, ele deixa uma fotografia daquele momento. A telemetria fornece outra sequência de fotografias do uso físico do veículo.

Combinadas, essas fontes podem apoiar análises de:

  • distância percorrida entre abastecimentos;
  • compatibilidade entre odômetro informado e observado;
  • consumo por período;
  • custo operacional por quilômetro;
  • comportamento fora do padrão;
  • autonomia observada.

Mais uma vez, não se trata de abolir o registro de abastecimento. O abastecimento possui natureza financeira e documental que a telemetria não substitui.

A integração enriquece o dado existente.

Manutenção pode deixar de depender apenas de atualização manual

O sistema do Pet Táxi já possui uma estrutura técnica para manutenção que pode representar componentes, procedimentos e intervalos.

Algumas manutenções dependem de tempo. Outras dependem de quilometragem. Algumas podem depender de uso.

A telemetria acrescenta uma fonte periódica para parte dessas grandezas.

Trecho 05 · arquitetura em estudo — manutenção orientada por uso observado
$odometroAtual = $telemetria->odometroKm();

$proximaRevisao =
    $ultimaRevisao->odometroKm()
    + $plano->intervaloKm();

$restante = $proximaRevisao - $odometroAtual;

if ($restante <= $margemDeAvisoKm) {
    $alertas->criar(
        veiculo: $veiculo,
        tipo: 'MANUTENCAO_PREVENTIVA',
        restanteKm: max(0, $restante)
    );
}

Também aqui existe uma distinção importante. A telemetria não decide qual manutenção o veículo precisa.

Nossa estrutura técnica continua responsável pela regra. A fonte externa ajuda a responder quanto o veículo foi utilizado. O conhecimento de manutenção continua pertencendo ao domínio da operação.

Motorista: quando um dado externo revela um conceito interno ausente

A integração também levantou uma questão interessante sobre motoristas.

A fonte de telemetria pode, em determinadas situações, possuir informação relacionada à pessoa identificada na condução. Nosso sistema, entretanto, ainda não possui uma modelagem operacional completa relacionando motorista, veículo, atendimento e período de condução.

Isso impede uma associação ingênua.

Estrutura conceitual · uma associação que não deve ser presumida
Motorista associado ao veículo
≠
Motorista responsável por qualquer operação daquele veículo

Veículos podem ser compartilhados. Pessoas podem alternar condução. Uma identificação pode estar indisponível. Uma viagem pode atravessar diferentes contextos.

Por isso, se esse conceito passar a fazer diferença para a operação, provavelmente precisará ganhar estrutura própria.

Elemento Relação necessária
Motorista Pessoa habilitada para condução
Veículo Veículo utilizado
Início Momento de início da alocação
Fim Momento de término
Atendimento Operação relacionada, quando conhecida
Origem da identificação Manual, escala ou telemetria

Esse é um ótimo exemplo de como integração também funciona como ferramenta de descoberta do domínio.

O dado chega antes da modelagem e nos obriga a perguntar o que ele realmente significa.

Coordenada não é destino

Talvez a mesma prudência seja ainda mais importante com localização.

No artigo anterior desta série, mostramos por que, para o Pet Táxi, um destino não deve ser tratado simplesmente como endereço. Um destino pode possuir características de acesso, funcionamento, referência, particularidades operacionais e conhecimento acumulado.

Telemetria acrescenta coordenadas. Mas coordenada e destino não são sinônimos.

Uma posição geográfica pode mostrar que o veículo esteve próximo de uma clínica. Ela não explica em qual entrada o atendimento ocorreu, se houve estacionamento, se existiu espera, se o animal foi entregue, se houve alteração de procedimento ou qual conhecimento operacional foi produzido naquela visita.

É justamente aí que os dois artigos começam a se encontrar. A localização externa não substitui o destino operacional. Ela acrescenta evidência àquilo que já sabemos sobre ele.

Uma chegada pode ser inferida. Mas inferência precisa continuar sendo inferência.

Imagine que o sistema conheça as coordenadas aproximadas de determinado destino e receba posições do veículo. Tecnicamente, seria possível desenvolver uma regra para identificar aproximação.

Trecho 06 · arquitetura em estudo — evento candidato a chegada
$distancia = distanciaEmMetros(
    $posicao->latitude(),
    $posicao->longitude(),
    $destino->latitude(),
    $destino->longitude()
);

if ($distancia <= $destino->raioOperacionalMetros()) {
    $eventos->registrarCandidato(
        tipo: 'POSSIVEL_CHEGADA',
        destino: $destino,
        ocorridoEm: $posicao->data()
    );
}

Observe a escolha das palavras: possível chegada.

Não: atendimento concluído.

Uma boa integração precisa preservar o grau de certeza de cada conclusão. Isso se torna ainda mais importante quando automações passam a influenciar indicadores, custos ou decisões operacionais.

Nem tudo que pode ser automatizado deve ser automatizado

Quanto mais dados um sistema recebe, maior a tentação de transformar todos eles em regras automáticas. Esse é um risco.

Algumas decisões são ótimas candidatas a automação. Outras deveriam inicialmente produzir apenas informação.

Situação Automação razoável Automação que exigiria muito mais cuidado
Nova leitura de odômetro Atualizar histórico observado Substituir silenciosamente todo odômetro manual
Diferença relevante Gerar alerta Corrigir lançamento automaticamente
Manutenção próxima Avisar responsável Ordenar serviço sem análise
Veículo próximo ao destino Registrar evento candidato Marcar atendimento como concluído
Distância acima da prevista Registrar comparação Cobrar automaticamente o cliente
Evento de condução Guardar para análise Aplicar consequência automática ao motorista

A pergunta correta não é “podemos automatizar?”.

Qual decisão esta informação realmente sustenta?

Governança também é arquitetura

Localização, deslocamento, identificação de motorista e comportamento de condução não são dados que deveriam circular pelo sistema sem propósito definido.

Uma integração desse tipo precisa responder antecipadamente:

  • por que cada informação será armazenada;
  • por quanto tempo ela terá utilidade;
  • quem poderá consultá-la;
  • que informações precisam ser agregadas em vez de exibidas individualmente;
  • o que realmente precisa ser preservado;
  • o que pode ser descartado depois de gerar um indicador;
  • quando uma informação operacional também se relaciona a uma pessoa.

Isso é engenharia tanto quanto escrever o código da integração.

Receber todos os dados disponíveis simplesmente porque a API os fornece seria a decisão mais fácil. Não necessariamente a melhor.

O sistema não precisa guardar a rua inteira para aprender com ela

Talvez determinada análise precise saber que um percurso consumiu 18,4 quilômetros, 47 minutos, determinado veículo e determinada janela de horário.

Ela pode não precisar guardar indefinidamente cada coordenada intermediária percorrida pelo veículo.

Isso cria uma distinção entre dados brutos e conhecimento derivado.

Dado bruto Informação que pode ser derivada
Sequência de posições Distância
Datas das posições Duração
Odômetros sucessivos Quilometragem por período
Movimento do veículo Uso
Posição próxima ao destino Evento candidato a chegada
Percursos acumulados Padrões operacionais

Uma arquitetura consciente pode consumir detalhe quando necessário e preservar apenas aquilo que continua possuindo valor para a operação.

O verdadeiro potencial aparece depois de muitas operações

Um percurso isolado é registro.

Dezenas deles começam a produzir comparação.

Centenas podem começar a produzir conhecimento.

Considere algumas perguntas que uma base histórica poderia ajudar a responder:

Pergunta Dados que poderiam contribuir
Nossas distâncias previstas continuam boas? Previsto × realizado
Quanto realmente percorremos por mês? Quilometragem observada
Quais regiões consomem mais tempo? Destinos × duração
Determinado tipo de operação costuma fugir da estimativa? Atendimento × percurso
O custo por quilômetro continua adequado? Custos × quilômetros observados
Quando determinada manutenção deve ocorrer? Plano técnico × uso
Existe diferença recorrente entre odômetros? Abastecimento × telemetria
Quais veículos são mais utilizados? Percursos × frota
Onde existem maiores tempos de espera? Destino × permanência observada

Esse talvez seja o ponto mais importante do projeto.

O valor não está em saber onde o veículo está neste minuto. Muitos sistemas já fazem isso.

O valor está em permitir que aquilo que aconteceu hoje melhore uma decisão que será tomada amanhã.

Telemetria não substitui experiência operacional

Seria fácil concluir que, depois dessa integração, o sistema passaria a conhecer a operação sozinho. Não é isso.

O dado pode mostrar: “o veículo permaneceu 22 minutos naquela região”.

A experiência humana pode explicar: “naquela clínica existe um procedimento de entrada que normalmente exige espera”.

Essas duas informações possuem naturezas diferentes. Uma é observação. A outra é interpretação operacional.

Quando as duas conseguem conviver, o sistema fica mais valioso. Não porque eliminou a experiência das pessoas, mas porque conseguiu dar estrutura para que diferentes formas de conhecimento se encontrem.

O fornecedor fornece dados. O significado continua sendo nosso.

Esse talvez seja o princípio arquitetural mais importante desta integração.

A plataforma de telemetria conhece muito bem aquilo que acontece com o veículo. Nosso sistema conhece aquilo que acontece com a operação.

Os dois lados possuem conhecimento diferente.

Se misturarmos essas responsabilidades, criaremos dependência e ambiguidade. Se mantivermos a separação, poderemos utilizar os dados externos sem abrir mão da nossa própria modelagem.

Essa segunda frase é onde mora a inteligência específica do negócio.

Estamos estudando, não anunciando algo pronto

A integração ainda está em estudo. E é importante dizer isso.

Ter acesso contratado a uma API não significa que a decisão correta seja começar imediatamente a gravar todos os dados que ela disponibiliza.

Antes é necessário compreender:

  • quais conceitos já existem;
  • quais ainda precisam ser modelados;
  • quais relações são confiáveis;
  • quais dados realmente criam valor;
  • quais automações são desejáveis;
  • quais devem permanecer assistidas;
  • como preservar histórico e origem das informações;
  • como impedir que um dado externo altere silenciosamente uma verdade interna.

Essa etapa não é atraso de implementação. É parte da implementação.

Quando o sistema começa a conferir a própria representação da realidade

No artigo anterior, mostramos como um sistema próprio pode aprender a linguagem da operação.

O orçamento não precisa ser apenas uma linha de tabela. O animal não precisa ser apenas um cadastro. O destino não precisa ser apenas endereço. O custo não precisa ser apenas valor.

Agora surge uma nova etapa.

O sistema que aprendeu a representar a operação pode começar a confrontar essa representação com aquilo que aconteceu fisicamente.

Planejamos 18,6 quilômetros. Percorremos 20,1.

Esperávamos 42 minutos. Observamos 49.

O abastecimento registrou determinado odômetro. A telemetria observou outro valor próximo.

Uma manutenção depende de quilômetros. O veículo continua acumulando uso.

Cada uma dessas diferenças isoladamente pode parecer pequena. O conjunto delas, acumulado ao longo do tempo, forma outra coisa:

feedback operacional.

E talvez essa seja a evolução mais interessante de um sistema próprio.

Primeiro ele registra.

Depois representa.

Em seguida relaciona.

E, quando consegue comparar aquilo que imaginávamos com aquilo que realmente aconteceu, começa a ajudar a empresa a aprender com a própria execução.

Não porque a máquina passou a conhecer o negócio sozinha.

Mas porque finalmente conseguimos colocar planejamento, experiência humana e evidências da operação para conversar dentro da mesma estrutura.

É quando o sistema deixa de enxergar apenas o que deveria acontecer e começa a aprender também com o que aconteceu na rua.

Temas: telemetria · integrações · sistemas sob medida · modelagem de domínio · frota · Pet Táxi · engenharia de software

Seu sistema conhece o que deveria acontecer. Mas ele consegue aprender com o que realmente aconteceu?

Integrar dados é fácil. Difícil é transformar dados externos em conhecimento que faça sentido para a operação.