Referência Completa — config.json
Este documento descreve todos os campos do arquivo config.json, seus valores padrão, valores válidos e o impacto de cada configuração no sistema.
Comportamento automático de atualização: ao iniciar, o sistema verifica se existem campos ausentes no config.json e os preenche automaticamente com os valores padrão, sem sobrescrever valores já existentes.
Estrutura Geral
{
"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
}
serilog — Logging
Controla o que é registrado em log, onde e com qual nível de detalhe.
"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}"
}
}
]
}
bancoDeDados — Banco de Dados
Conexão com o SQL Server onde as comandas são registradas.
"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;"
}
comanda — Ciclo de Pesagem
Controla como as comandas são geradas e o fluxo do ciclo de atendimento.
"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
}
impressora — Impressora de Comandas
Configuração da impressora térmica que emite a comanda física.
"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:<nome>.
// 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
}
balancas — Lista de Balanças
Array com uma ou mais balanças. Cada item configura uma balança independente. Os nomes devem ser únicos.
"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
}
}
]
Referência rápida de tunagem por modelo de balança
| Modelo |
timeoutLePesoMs |
leiturasParaEstabilizar |
passoQuantizacaoKg |
Intervalo |
| Filizola DP-30 / MF (RS-232 9600) |
1000 |
3 |
0.005 |
200 |
| Toledo Prix 3 (RS-232 9600) |
800 |
2 |
0.005 |
200 |
| Toledo Prix 3 (RS-232 19200) |
400 |
2 |
0.005 |
150 |
| Dimep S-550 (RS-232) |
600 |
3 |
0.002 |
200 |
| Elgin DP-30 (RS-232 9600) |
1000 |
3 |
0.005 |
200 |
| Qualquer modelo (USB/RS-422 rápido) |
200 |
2 |
0.005 |
100 |
| Simulada (para testes) |
— |
— |
— |
— |
ui — Interface do Usuário
Define o tema visual ativo e os temas disponíveis.
"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"
}
}
}
}
Temas pré-configurados
| Chave |
Descrição |
azul-moderno |
Tema padrão. Azul claro com acentos em azul escuro. |
verde-classico |
Verde escuro, ideal para ambientes externos. |
amarelo-gourmet |
Tons dourados, indicado para ambientes gastronômicos. |
vermelho-rustico |
Tons avermelhados, visual rústico/artesanal. |
escuro-elegante |
Tema escuro com destaque em âmbar, reduz brilho em ambientes noturnos. |
Exemplo completo mínimo
Configuração funcional com o menor número de campos necessários (demais campos usam os padrões):
{
"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"
}
}
]
}
Notas importantes
- Múltiplas balanças: adicione quantos objetos quiser no array
balancas. Cada uma deve ter um nome único e pode ter parâmetros de estabilidade diferentes.
- Balança simulada: use
"modelo": "simulada" para rodar o sistema sem hardware físico. Ignora todos os parâmetros seriais.
- Tara: o valor de
tara é subtraído antes de qualquer processamento de peso no LeitorDePeso. Configure com o peso real do recipiente vazio.
- Atualização automática: campos novos adicionados em versões futuras do sistema serão inseridos automaticamente no
config.json com seus valores padrão na próxima inicialização.