<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Manual de configuração AutoChef - Totem Pesagem]]></title><description><![CDATA[<h1>Referência Completa — config.json</h1>
<p dir="auto">Este documento descreve <strong>todos os campos</strong> do arquivo <code>config.json</code>, seus valores padrão, valores válidos e o impacto de cada configuração no sistema.</p>
<blockquote>
<p dir="auto"><strong>Comportamento automático de atualização:</strong> ao iniciar, o sistema verifica se existem campos ausentes no <code>config.json</code> e os preenche automaticamente com os valores padrão, sem sobrescrever valores já existentes.</p>
</blockquote>
<hr />
<h2>Estrutura Geral</h2>
<pre><code class="language-jsonc">{
  "serilog":     { ... },   // Configuração de logging
  "bancoDeDados": { ... },  // Conexão com SQL Server
  "comanda":     { ... },   // Comportamento do ciclo de pesagem
  "impressora":  { ... },   // Configuração da impressora de comandas
  "balancas":    [ ... ],   // Lista de balanças (uma ou mais)
  "ui":          { ... }    // Temas visuais da interface
}
</code></pre>
<hr />
<h2><code>serilog</code> — Logging</h2>
<p dir="auto">Controla o que é registrado em log, onde e com qual nível de detalhe.</p>
<pre><code class="language-jsonc">"serilog": {
  // Nível mínimo de log registrado.
  // Valores válidos (do mais detalhado ao menos): Verbose | Debug | Information | Warning | Error | Fatal
  // Padrão: "Information"
  "minimumLevel": "Debug",

  // Enriquecedores que adicionam informações automáticas a cada log.
  // Valores suportados: "FromLogContext", "WithMachineName", "WithThreadId"
  "enrich": [
    "FromLogContext",
    "WithMachineName",
    "WithThreadId"
  ],

  // Destinos de saída do log. Pode conter múltiplos destinos.
  "writeTo": [
    {
      // Console: exibe os logs no terminal
      "name": "Console",
      "args": {
        // Template de formatação da mensagem no console
        "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{MachineName}] [{ThreadId}] {Message:lj}{NewLine}{Exception}"
      }
    },
    {
      // File: persiste os logs em arquivo rotativo por dia
      "name": "File",
      "args": {
        // Caminho do arquivo de log
        "path": "logs/servico-pesagem.txt",

        // Rotação automática do arquivo. Valores: Infinite | Year | Month | Day | Hour | Minute
        // Padrão: "Day"
        "rollingInterval": "Day",

        // Quantidade de arquivos antigos mantidos. Null = sem limite.
        // Padrão: 7
        "retainedFileCountLimit": 7,

        // Template de formatação da mensagem no arquivo
        "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{MachineName}] [{ThreadId}] {Message:lj}{NewLine}{Exception}"
      }
    }
  ]
}
</code></pre>
<hr />
<h2><code>bancoDeDados</code> — Banco de Dados</h2>
<p dir="auto">Conexão com o SQL Server onde as comandas são registradas.</p>
<pre><code class="language-jsonc">"bancoDeDados": {
  // ID da empresa no banco de dados.
  // Padrão: 1
  "idEmpresa": 1,

  // String de conexão ADO.NET para SQL Server.
  // Inclua TrustServerCertificate=True para ambientes sem certificado SSL.
  "connectionString": "Server=192.168.1.10,1433;Database=AutomatizeDB;User Id=sa;Password=senha;TrustServerCertificate=True;"
}
</code></pre>
<hr />
<h2><code>comanda</code> — Ciclo de Pesagem</h2>
<p dir="auto">Controla como as comandas são geradas e o fluxo do ciclo de atendimento.</p>
<pre><code class="language-jsonc">"comanda": {
  // Define se a comanda é gerada automaticamente pelo sistema (true)
  // ou informada manualmente/por leitor (false).
  // Padrão: true
  "auto": true,

  // Status inicial com que a comanda é aberta no banco de dados.
  //   0 = Aberta  →  produto é adicionado normalmente
  //   1 = Fechada →  comanda criada como fechada
  //   2 = Cancelada → comanda criada sem adicionar produto (pesagem livre)
  // Padrão: 0
  "statusInicial": 0,

  // Define qual evento é esperado primeiro quando auto = false.
  //   0 = PesoPrimeiro    → o prato é colocado, depois a comanda é lida
  //   1 = ComandaPrimeiro → a comanda é lida, depois o prato é colocado
  // Ignorado quando auto = true.
  // Padrão: 1
  "ordem": 1,

  // Número inicial do intervalo de comandas geradas/aceitas.
  // Padrão: 1000
  "inicio": 1000,

  // Número final do intervalo de comandas geradas/aceitas.
  // Padrão: 9999
  "fim": 9999,

  // Número da próxima comanda a ser emitida (modo auto).
  // Ao atingir "fim", reinicia em "inicio" automaticamente.
  // Padrão: 1000
  "atual": 1000,

  // Se true, rejeita o número da comanda se ele estiver fora do intervalo [inicio, fim].
  // Padrão: false
  "validaLimites": false,

  // Se true, impede que a mesma comanda seja emitida duas vezes em sequência.
  // Padrão: false
  "evitarRepetidas": false,

  // Tempo em segundos que o sistema aguarda a leitura da comanda após o peso
  // ter sido registrado (somente no modo ordem = PesoPrimeiro).
  // Ao expirar, o ciclo é cancelado e reiniciado.
  // Padrão: 30
  "tempoAguardandoComanda": 30
}
</code></pre>
<hr />
<h2><code>impressora</code> — Impressora de Comandas</h2>
<p dir="auto">Configuração da impressora térmica que emite a comanda física.</p>
<pre><code class="language-jsonc">"impressora": {
  // Habilita ou desabilita a impressão. Se false, o ciclo funciona sem imprimir.
  // Padrão: false
  "imprimir": true,

  // Ativa o modo de debug da impressora. Ao invés de enviar para a impressora física
  // via ACBr, grava a saída em logs/impressao-debug.txt.
  // Útil para testes sem hardware real.
  // Padrão: false
  "debug": false,

  // Nome do arquivo de template da comanda, localizado na pasta Templates/.
  // Padrão: "template_padrao.txt"
  "templateImpressao": "template_padrao.txt",

  // Nome da impressora conforme cadastrado no sistema operacional ou RAW:&lt;nome&gt;.
  // Padrão: "Impressora Padrão"
  "nomeImpressora": "Impressora de Comanda",

  // Modelo/protocolo da impressora. Deve corresponder a um valor do enum ACBrPosPrinterModelo.
  // Exemplos: "ppEscPosEpson", "ppEscPosBematech", "ppPosPrinter"
  // Padrão: "ppEscPosEpson"
  "modelo": "ppEscPosEpson",

  // Porta de comunicação. Exemplos: "COM1", "USB:NomeImpressora", "RAW:NomeImpressora"
  // Padrão: "COM1"
  "porta": "RAW:BALANCA",

  // Largura do papel em mm. Padrão: 80
  "largura": 80,

  // Altura máxima da área de impressão em mm. Padrão: 200
  "altura": 200
}
</code></pre>
<hr />
<h2><code>balancas</code> — Lista de Balanças</h2>
<p dir="auto">Array com uma ou mais balanças. Cada item configura uma balança independente. Os nomes devem ser únicos.</p>
<pre><code class="language-jsonc">"balancas": [
  {
    // Nome identificador da balança (deve ser único entre todas as balanças).
    "nome": "Buffet Principal",

    // Modelo da balança, correspondente ao enum ACBrBALModelo da biblioteca ACBr.
    // Exemplos: "balFilizola", "balToledo", "balDimep", "simulada"
    // Use "simulada" para testes sem hardware físico.
    "modelo": "balFilizola",

    // Porta serial. Exemplos: "COM1", "COM8"
    "porta": "COM8",

    // ── Parâmetros de comunicação serial ──────────────────────────────────────

    // Taxa de transmissão em bps. Valores válidos: 110 | 300 | 600 | 1200 | 2400 |
    // 4800 | 9600 | 14400 | 19200 | 38400 | 57600 | 115200
    // Consulte o manual da balança. Padrão mais comum: 9600
    "baud": 9600,

    // Bits de dados por símbolo. Valores válidos: 5 | 6 | 7 | 8. Padrão: 8
    "dataBits": 8,

    // Paridade de erro. Valores válidos: "None" | "Odd" | "Even" | "Mark" | "Space"
    // Padrão: "None"
    "parity": "None",

    // Bits de parada. Valores válidos: 0 (1 bit) | 1 (1.5 bits) | 2 (2 bits). Padrão: 0
    "stopBits": 0,

    // Controle de fluxo por hardware.
    // 0 = Nenhum | 1 = XON/XOFF | 2 = RTS/CTS | 3 = DTR/DSR. Padrão: 0
    "handShake": 0,

    // Parâmetros avançados de comunicação (normalmente não precisam ser alterados)
    "maxBandwidth": 100,
    "sendBytesCount": 1,
    "sendBytesInterval": 100,
    "softFlow": false,
    "hardFlow": false,

    // Posição inicial e final do dado de peso na resposta da balança (protocolo raw).
    // 0 = usa o protocolo padrão do modelo ACBr. Padrão: 0
    "posIni": 0,
    "posFim": 0,

    // ── Parâmetros de estabilidade e leitura ─────────────────────────────────

    // Intervalo em ms entre cada chamada de leitura no loop interno.
    // Valores menores = leituras mais frequentes, maior uso de CPU.
    // Padrão: 200
    "Intervalo": 200,

    // Número de leituras consecutivas com o mesmo valor necessárias para
    // considerar o peso estabilizado e emitir o evento.
    // Aumente para balanças que oscilam muito mecanicamente.
    // Padrão: 3 | Mín: 1 | Máx: 20
    "leiturasParaEstabilizar": 3,

    // Passo de quantização em kg usado para comparar estabilidade entre leituras.
    // Leituras com diferença menor que este valor são tratadas como iguais.
    // Balanças de alta resolução (1g) podem usar 0.002; balanças de 5g usam 0.005.
    // Padrão: 0.005 | Mín: 0.001 | Máx: 1.000
    "passoQuantizacaoKg": 0.005,

    // Timeout em ms de cada chamada LePeso() à biblioteca ACBr.
    // Balanças seriais lentas (9600 baud) podem precisar de 1000ms.
    // Balanças rápidas (USB/RS-422) podem usar 300ms.
    // Padrão: 1000 | Mín: 100 | Máx: 5000
    "timeoutLePesoMs": 1000,

    // Tempo máximo em ms de instabilidade antes de o detector de estabilidade
    // ser resetado automaticamente. Evita que o sistema trave se a balança
    // nunca estabilizar (ex: objeto em balanço).
    // Padrão: 10000 | Mín: 1000 | Máx: 60000
    "janelaMaxSemEstabilizarMs": 10000,

    // Se true, ignora uma nova pesagem com o mesmo peso da pesagem anterior.
    // Útil para evitar duplo lançamento se o cliente deixar o prato por mais tempo.
    // Padrão: false
    "evitarPesosRepetidos": false,

    // ── Tara e Produto ────────────────────────────────────────────────────────

    // Tara em kg a ser subtraída de cada leitura. 0 = sem tara.
    // Exemplo: 0.120 desconta 120g do peso bruto (peso do prato).
    // Padrão: 0
    "tara": 0.120,

    // Produto vinculado a esta balança.
    // O código é usado para consultar preço e nome no banco de dados.
    "produto": {
      // Código do produto no banco de dados.
      "codigo": "112",

      // Nome exibido na tela (pode ser sobrescrito pelo banco de dados).
      "nome": "Buffet Kg",

      // Unidade de medida exibida. Exemplos: "kg", "g", "un"
      "unidade": "kg",

      // Preço por kg. Sobrescrito automaticamente pelo banco de dados ao iniciar.
      "preco": 59.90
    }
  }
]
</code></pre>
<h3>Referência rápida de tunagem por modelo de balança</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Modelo</th>
<th><code>timeoutLePesoMs</code></th>
<th><code>leiturasParaEstabilizar</code></th>
<th><code>passoQuantizacaoKg</code></th>
<th><code>Intervalo</code></th>
</tr>
</thead>
<tbody>
<tr>
<td>Filizola DP-30 / MF (RS-232 9600)</td>
<td>1000</td>
<td>3</td>
<td>0.005</td>
<td>200</td>
</tr>
<tr>
<td>Toledo Prix 3 (RS-232 9600)</td>
<td>800</td>
<td>2</td>
<td>0.005</td>
<td>200</td>
</tr>
<tr>
<td>Toledo Prix 3 (RS-232 19200)</td>
<td>400</td>
<td>2</td>
<td>0.005</td>
<td>150</td>
</tr>
<tr>
<td>Dimep S-550 (RS-232)</td>
<td>600</td>
<td>3</td>
<td>0.002</td>
<td>200</td>
</tr>
<tr>
<td>Elgin DP-30 (RS-232 9600)</td>
<td>1000</td>
<td>3</td>
<td>0.005</td>
<td>200</td>
</tr>
<tr>
<td>Qualquer modelo (USB/RS-422 rápido)</td>
<td>200</td>
<td>2</td>
<td>0.005</td>
<td>100</td>
</tr>
<tr>
<td>Simulada (para testes)</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
</tbody>
</table>
<hr />
<h2><code>ui</code> — Interface do Usuário</h2>
<p dir="auto">Define o tema visual ativo e os temas disponíveis.</p>
<pre><code class="language-jsonc">"ui": {
  // Nome do tema ativo. Deve ser uma das chaves de "temasDisponiveis".
  // Padrão: "azul-moderno"
  "tema": "azul-moderno",

  // Mapa de temas disponíveis. Cada tema define as cores da interface.
  "temasDisponiveis": {
    "nome-do-tema": {
      // Cor de fundo da página principal
      "fundo": "#e3f2fd",

      // Cor de fundo do topo/cabeçalho
      "topo": "#0d47a1",

      // Cor de destaque (elementos em evidência)
      "destaque": "#64b5f6",

      // Cor do texto no topo
      "texto-topo": "#ffffff",

      // Cor de fundo do painel de valor
      "valor": "#1976d2",

      // Cor do texto no painel de valor
      "valorTexto": "#ffffff",

      // Cor do label acima do valor
      "valorLabel": "#bbdefb",

      // Cor de fundo do valor quando em destaque (ex: peso confirmado)
      "valorDestaque": "#64b5f6",

      // Cor do texto do valor em destaque
      "valorTextoDestaque": "#0d47a1",

      // Cor de fundo de painéis de informação secundária
      "info": "#90caf9",

      // Cor de fundo do rodapé
      "rodapeFundo": "#0d47a1",

      // Cor do texto no rodapé
      "rodapeTexto": "#ffffff",

      // Cor de fundo da área do logo
      "logoFundo": "#ffffff",

      // Cor do texto/ícone do logo
      "logoTexto": "#0d47a1",

      // Cor base do spinner de carregamento (anel externo)
      "spinnerBase": "#90caf9",

      // Cor do topo do spinner (anel ativo)
      "spinnerTopo": "#1565c0",

      // Cor do texto dentro do spinner
      "spinnerTexto": "#1565c0",

      // Cores de fundo dos banners de mensagem por tipo
      "mensagem": {
        "erro":           "#d32f2f",  // Erro crítico
        "acao-requerida": "#f57c00",  // Ação necessária do operador
        "alerta":         "#fdd835",  // Aviso não crítico
        "sucesso":        "#2e7d32",  // Operação concluída com sucesso
        "info":           "#0288d1",  // Informação neutra
        "neutra":         "#90a4ae"   // Mensagem sem classificação
      },

      // Cores do texto dos banners de mensagem (devem contrastar com "mensagem")
      "mensagemTexto": {
        "erro":           "#ffffff",
        "acao-requerida": "#ffffff",
        "alerta":         "#000000",
        "sucesso":        "#ffffff",
        "info":           "#ffffff",
        "neutra":         "#000000"
      }
    }
  }
}
</code></pre>
<h3>Temas pré-configurados</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Chave</th>
<th>Descrição</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>azul-moderno</code></td>
<td>Tema padrão. Azul claro com acentos em azul escuro.</td>
</tr>
<tr>
<td><code>verde-classico</code></td>
<td>Verde escuro, ideal para ambientes externos.</td>
</tr>
<tr>
<td><code>amarelo-gourmet</code></td>
<td>Tons dourados, indicado para ambientes gastronômicos.</td>
</tr>
<tr>
<td><code>vermelho-rustico</code></td>
<td>Tons avermelhados, visual rústico/artesanal.</td>
</tr>
<tr>
<td><code>escuro-elegante</code></td>
<td>Tema escuro com destaque em âmbar, reduz brilho em ambientes noturnos.</td>
</tr>
</tbody>
</table>
<hr />
<h2>Exemplo completo mínimo</h2>
<p dir="auto">Configuração funcional com o menor número de campos necessários (demais campos usam os padrões):</p>
<pre><code class="language-jsonc">{
  "serilog": {
    "minimumLevel": "Information",
    "writeTo": [
      { "name": "Console" }
    ]
  },
  "bancoDeDados": {
    "idEmpresa": 1,
    "connectionString": "Server=localhost;Database=Petiskos;User Id=sa;Password=senha;TrustServerCertificate=True;"
  },
  "comanda": {
    "auto": true,
    "ordem": 0
  },
  "impressora": {
    "imprimir": false
  },
  "balancas": [
    {
      "nome": "Balanca 1",
      "modelo": "simulada",
      "porta": "COM1",
      "baud": 9600,
      "dataBits": 8,
      "parity": "None",
      "stopBits": 0,
      "handShake": 0,
      "produto": {
        "codigo": "001",
        "nome": "Produto",
        "unidade": "kg"
      }
    }
  ]
}
</code></pre>
<hr />
<h2>Notas importantes</h2>
<ul>
<li><strong>Múltiplas balanças:</strong> adicione quantos objetos quiser no array <code>balancas</code>. Cada uma deve ter um <code>nome</code> único e pode ter parâmetros de estabilidade diferentes.</li>
<li><strong>Balança simulada:</strong> use <code>"modelo": "simulada"</code> para rodar o sistema sem hardware físico. Ignora todos os parâmetros seriais.</li>
<li><strong>Tara:</strong> o valor de <code>tara</code> é subtraído <strong>antes</strong> de qualquer processamento de peso no <code>LeitorDePeso</code>. Configure com o peso real do recipiente vazio.</li>
<li><strong>Atualização automática:</strong> campos novos adicionados em versões futuras do sistema serão inseridos automaticamente no <code>config.json</code> com seus valores padrão na próxima inicialização.</li>
</ul>
]]></description><link>https://forum.automatize.solutions/topic/259/manual-de-configuração-autochef-totem-pesagem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 15 Oct 2026 14:52:05 GMT</lastBuildDate><atom:link href="https://forum.automatize.solutions/topic/259.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Mar 2026 16:36:25 GMT</pubDate><ttl>60</ttl></channel></rss>