TECHRIB IOT CLOUD · CENTRAL PARA DESENVOLVEDORES
Do código ESP-IDF ao componente no aplicativo
Aprenda a estruturar seu próprio firmware, declarar componentes compatíveis com o contrato TechRib V2, implementar estados e comandos e entender o pareamento por QR Code e Bluetooth. Exemplos públicos e independentes, sem distribuir o firmware proprietário.
Base técnica: contrato TechRib V2 2.0.0 · ESP-IDF 5.x · referências de firmware e aplicativo de outubro de 2026. Exemplos são didáticos; integração completa exige autorização e homologação.
Entenda as camadas da integração
Uma placa compatível executa um firmware ESP-IDF que controla seu próprio hardware e anuncia somente os componentes existentes. A TechRib Cloud valida a identidade, recebe o inventário e os estados, e expõe os controles autorizados ao app Flutter e ao dashboard.
Contrato não é driver: um tipo como energy_meter está definido no catálogo, mas seu firmware precisa implementar a aquisição física e validar as medições. O catálogo impede comandos não declarados; o backend também deve autorizá-los.
Crie um projeto ESP-IDF do zero
Instale o ESP-IDF 5.x e a extensão oficial no VS Code. Escolha o alvo compatível com seu chip e inicie com um projeto vazio. Compile primeiro sem acionamento físico.
meu_dispositivo/
├── CMakeLists.txt
├── main/
│ ├── CMakeLists.txt
│ ├── app_main.c
│ ├── board_profile.c # Tipos e identificadores do hardware
│ ├── board_profile.h
│ └── cloud_bridge.c # Integração MQTT/TLS autorizada
└── sdkconfig.defaults# Terminal ESP-IDF configurado (ESP32 clássico)
idf.py set-target esp32
idf.py menuconfig
idf.py build
# Para ESP32-S3, use set-target esp32s3 em um projeto adequado.Para estudar a construção do perfil, comece com IDs estáveis (luz_sala, rgb_sala, temperatura_1). O driver deve registrar estado inicial conhecido e reagir somente a comandos declarados. Identidade autorizada, certificados, BLE/QR e registro no servidor não surgem automaticamente de um projeto vazio.
// Modelo didático: declaração própria, sem integrar ainda ao broker.
typedef struct {
const char *id;
const char *type;
const char *name;
} my_component_t;
static const my_component_t components[] = {
{"luz_sala", "switch", "Luz da sala"},
{"rgb_sala", "light_rgb", "Fita RGB"},
{"temp_1", "temperature", "Temperatura"}
};
// Próxima fase: criar manifesto, drivers, validações e transporte.Pareamento por QR Code e Bluetooth: experiência TechRib
O fluxo de experiência segue boas práticas de provisionamento BLE, como as explicadas na documentação ESP RainMaker, porém o formato do QR e a ativação são específicos da TechRib. Um QR do RainMaker não é aceito como QR TechRib.
- Prepare a conta: a empresa e o usuário precisam ter acesso autorizado à plataforma.
- Coloque a placa em modo de pareamento: o firmware anuncia BLE com o nome previsto para a família ESP32.
- Abra a inclusão de dispositivos no app: habilite Bluetooth e as permissões solicitadas pelo Android.
- Escaneie o QR oficial da TechRib: o aplicativo valida o protocolo, o host de ativação, a identidade BLE e o PoP.
- Escolha a rede Wi-Fi e forneça a senha no aplicativo: a sessão BLE com Security 1 transporta o provisionamento; a rede precisa ser compatível com o chip.
- Aguarde a conexão e a aprovação: o dispositivo se apresenta à nuvem, a solicitação é validada e o app acompanha o estado de ativação.
- Confira os componentes: após manifesto e estados válidos, os cards podem aparecer no dashboard e no aplicativo.
Formato ilustrativo de QR V2
O app atual aceita o protocolo techrib-pairing-v2 com transport: ble e security: 1. A URL de ativação usa HTTPS no domínio administrativo e um código temporário emitido legitimamente pelo servidor; o exemplo abaixo contém um marcador fictício que não ativa nenhum dispositivo.
{
"ver": "v2",
"name": "TechRibESP32S3DEMO",
"pop": "0123456789abcdef",
"transport": "ble",
"security": 1,
"techrib": {
"protocol": "techrib-pairing-v2",
"activation_url": "https://admin.iot.techrib.com.br/ativar?c=00000000000000000000000000000000",
"ble_active": true,
"board_family": "esp32-s3"
}
}A verificação do servidor é indispensável: conhecer o QR não confere acesso automaticamente. O exemplo não substitui a emissão de identidade e de código pela infraestrutura TechRib. Em placas já provisionadas pode existir apenas a URL de ativação, conforme o fluxo autorizado.
Os tópicos MQTT e o envelope TechRib V2
O firmware universal do pacote utiliza techrib.capabilities, versão 2.0.0. Os tópicos seguem o identificador legítimo do dispositivo, e a comunicação remota usa MQTT com TLS e credenciais provisionadas.
techrib/devices/SEU_DEVICE_ID/telemetry # manifesto
techrib/devices/SEU_DEVICE_ID/state # estado real
techrib/devices/SEU_DEVICE_ID/event # ACK e eventos
techrib/devices/SEU_DEVICE_ID/availability # disponibilidade
techrib/devices/SEU_DEVICE_ID/command # comandos de entradaOs exemplos usam identificadores fictícios. Mensagens V2 são envelopes com contract, version, message_id, device_id, kind, timestamp e payload. Algumas mensagens também exigem component_id ou correlation_id.
Como o aplicativo descobre os componentes
Cada item do manifesto possui ID estável, tipo presente no catálogo, nome, transporte e somente os comandos realmente suportados. A identidade do componente não deve mudar entre reinicializações.
{
"contract": "techrib.capabilities",
"version": "2.0.0",
"message_id": "manifest_demo_001",
"device_id": "ESP32_DEMO_01",
"kind": "manifest",
"timestamp": "2026-10-30T18:00:00Z",
"payload": {
"contract": "techrib.capabilities",
"version": "2.0.0",
"device_id": "ESP32_DEMO_01",
"hardware": {"model": "ESP32 demo", "firmware_version": "1.0.0"},
"components": [
{"id":"luz_sala","type":"switch","name":"Luz da sala",
"transport":"local","commands":["set_power"]},
{"id":"rgb_sala","type":"light_rgb","name":"RGB sala",
"transport":"local","commands":["set_power","set_rgb","set_brightness"]},
{"id":"temp_1","type":"temperature","name":"Temperatura",
"transport":"wired","commands":[]}
]
}
}O backend confere o manifesto contra o catálogo V2 e as permissões. Componentes repetidos precisam ter IDs distintos, por exemplo rgb_sala e rgb_quarto; o mesmo vale para sensores.
Publicação de estados e leitura dos sensores
O estado representa o que foi observado ou confirmado pelo dispositivo, não uma previsão da interface. Relatórios devem usar campos e unidades definidos no catálogo.
{
"contract": "techrib.capabilities",
"version": "2.0.0",
"message_id": "state_temp_001",
"device_id": "ESP32_DEMO_01",
"kind": "state",
"component_id": "temp_1",
"timestamp": "2026-10-30T18:00:10Z",
"payload": {"state": {"temperature_c": 24.6}, "quality": "valid"}
}Repita o padrão para outros componentes, trocando component_id e campos de state. Quando um comando altera uma saída, publique o estado resultante com correlation_id quando disponível.
Validar, executar, confirmar
O backend pode enviar um comando somente se o tipo e o manifesto o permitirem. O firmware precisa verificar o destino, a data, o message_id, a ação e os argumentos; rejeitar mensagens antigas ou duplicadas; e manter a proteção local independente da internet.
{
"contract": "techrib.capabilities",
"version": "2.0.0",
"message_id": "cmd_000001",
"device_id": "ESP32_DEMO_01",
"kind": "command",
"component_id": "luz_sala",
"timestamp": "2026-10-30T18:00:00Z",
"payload": {"command": "set_power", "args": {"power": true}}
}A confirmação do firmware usa kind: ack, status accepted, executed ou failed, e correlação com o message_id do comando. ACK aceito não significa que a saída foi acionada.
{
"contract": "techrib.capabilities",
"version": "2.0.0",
"message_id": "ack_000001",
"device_id": "ESP32_DEMO_01",
"kind": "ack",
"component_id": "luz_sala",
"correlation_id": "cmd_000001",
"status": "executed",
"timestamp": "2026-10-30T18:00:01Z",
"payload": {}
}Interruptores, relés lógicos e pulsadores
Para uma saída simples, declare switch com comando set_power e estado power. O firmware genérico da TechRib permite perfis de saída configuráveis e modos de atuação; a escolha do GPIO depende da placa e deve ser validada separadamente.
{"id":"luz_1","type":"switch","name":"Luz 1",
"transport":"local","commands":["set_power","toggle"]}
// Estado após confirmação
{"power":true,"actuation_mode":"latch","pulse_duration_ms":500}
// Exemplo de payload de comando
{"command":"set_power","args":{"power":true}}Para acionamento por tempo, o catálogo oferece relay_pulse com comando pulse e argumento duration_ms. Em switch, modos latch, toggle e pulse só devem ser anunciados se implementados.
{"id":"campainha_1","type":"relay_pulse","name":"Pulso 1",
"transport":"local","commands":["pulse"]}
{"command":"pulse","args":{"duration_ms":500}}RGB: canais independentes, cor e brilho
O firmware universal enviado contém perfis nativos para até dois conjuntos RGB convencionais independentes, sujeitos à disponibilidade real de recursos PWM/GPIO. Cada RGB precisa ter um ID próprio; na nuvem, é um componente light_rgb, não três switches separados.
{"id":"rgb_sala","type":"light_rgb","name":"RGB sala",
"transport":"local",
"commands":["set_power","set_rgb","set_brightness"]}
// Estado compatível com o contrato
{"power":true,"r":255,"g":80,"b":12,"brightness":70}
// Comandos separados
{"command":"set_rgb","args":{"r":255,"g":80,"b":12}}
{"command":"set_brightness","args":{"brightness":70}}Os valores r/g/b vão de 0 a 255; brightness vai de 0 a 100. O app Flutter agrupa light_rgb na família RGB, usa o ícone padrão de paleta e pode abrir controles dedicados de cor e brilho. Para RGBW, CCT ou LED endereçável, consulte o respectivo contrato: não presuma driver pronto.
// Estrutura de lógica independente de fabricante (pseudocódigo)
if (comando == SET_RGB && args_validos) {
rgb_sala.r = r; rgb_sala.g = g; rgb_sala.b = b;
aplicar_pwm_normalizado(rgb_sala); // implementar no hardware
publicar_estado_confirmado("rgb_sala");
}Temperatura, umidade, LDR, presença e portas
O firmware de referência demonstra DHT11, leitura analógica, presença e porta. Para cada sensor físico, crie IDs separados e publique somente campos válidos. Uma leitura de ADC bruta de LDR não equivale a lux sem calibração.
{"id":"temp_1","type":"temperature","name":"Temperatura","commands":[]}
{"state":{"temperature_c":24.6},"quality":"valid"}
{"id":"umid_1","type":"humidity","name":"Umidade","commands":[]}
{"state":{"humidity_pct":58.0},"quality":"valid"}
{"id":"ldr_1","type":"analog_input","name":"LDR (ADC bruto)","commands":[]}
{"state":{"value":2350},"quality":"valid"}
{"id":"presenca_1","type":"presence","name":"Presença","commands":[]}
{"state":{"detected":false},"quality":"valid"}
{"id":"porta_1","type":"door_sensor","name":"Porta","commands":[]}
{"state":{"open":false},"quality":"valid"}Uma única amostra DHT pode alimentar dois componentes, temperatura e umidade, mas são dois IDs e dois estados. Em vários sensores iguais, o índice deve ser estável e a atribuição de pinos não pode conflitar com RGB, saídas ou recursos internos da placa. Falha de leitura exige estado inválido/ausente — não publique medição fictícia.
Persianas: abrir, fechar e parar
Para persianas simples, declare um cover com três comandos: open, close e stop. Internamente, o firmware de referência modela duas direções e tem lógica de intertravamento; no app aparece um único controle de persiana.
{"id":"persiana_sala","type":"cover","name":"Persiana da sala",
"commands":["open","close","stop"]}
{"state":{"status":"stopped","direction":"stopped"},"quality":"valid"}
{"command":"open","args":{}}
{"command":"stop","args":{}}O estado cover suporta status e direction. cover_position é outro tipo, com position de 0 a 100, e exige medição ou estimação validada da posição: não anuncie percentual se não o possui.
Gateway Modbus RTU: módulos, endereços e limites
O Gateway ESP32 Modbus é um firmware dedicado, diferente do firmware universal de GPIO. Nos arquivos recebidos ele inicia desabilitado por padrão. O código implementa o enquadramento Modbus RTU para ler coils (FC01), ler entradas discretas (FC02) e escrever coil individual (FC05), sujeito ao mapeamento real do fabricante.
# Exemplo ilustrativo do campo de módulos no menuconfig
# endereço, tipo R (relé) ou I (entrada), canais, offset zero-based, ID
1,R,16,0,rele01;2,I,16,0,entradas01
# Associações locais opcionais — primeiro canal de entrada ao de relé
entradas01:1=rele01:1:toggleEsse exemplo descreve dois módulos e 32 IDs lógicos: rele01_01 até rele01_16 e entradas01_01 até entradas01_16. A configuração do Laravel apresentada no painel Modbus é atualmente de planejamento: não configura um Gateway em produção automaticamente nem cria cards de hardware real.
Módulo R
16 relés · endereço 1 · FC01 para leitura · FC05 para comando · representar como saída/interruptor se houver estado real publicado.
Módulo I
16 entradas discretas · endereço 2 · FC02 para leitura · criar componentes de entrada conforme o tipo e estado efetivamente suportados.
Todos os equipamentos no mesmo barramento exigem endereços Modbus válidos e distintos. A tabela Modbus dos fabricantes pode usar offsets diferentes e suportar funções distintas; confirme no manual de cada equipamento. Parâmetros como taxa e paridade precisam coincidir.
Como o tipo do firmware determina o card e o ícone
O Flutter obtém do Laravel o type e, quando configurado, o campo icon. Primeiro utiliza um ícone personalizado reconhecido; caso contrário, escolhe um padrão por tipo ou família. O mesmo tipo pode exibir aparência diferente conforme tema, permissões e configurações do usuário.
| Tipos do manifesto | Componente visual padrão (Flutter) | Card/controle esperado |
|---|---|---|
switch, outlet | Alternância / toggle | Ligar e desligar, se set_power declarado |
light_rgb, light_rgbw, light_addressable | Paleta | Cor, brilho e estado conforme comandos |
temperature, temperature_probe | Termômetro | Leitura de temperatura |
humidity, humidity_controller | Gota | Umidade |
presence, motion | Sensor | Indicador de presença |
door_sensor, window_sensor | Porta | Aberta/fechada |
cover, cover_position | Persiana | Subir, descer, parar ou posição, conforme tipo |
motor, vfd | Motor | Controle do motor |
energy_meter, power, voltage, current | Raio/energia | Medidas elétricas |
rf_433_*, lora_* | Antena | Telemetria e controles autorizados |
| Demais medições | Monitor/sensor | Leitura conforme state_schema |
O app também oferece escolhas de ícones: lightbulb (iluminação), activity (sensor), motor, droplets, antenna, zap e thermometer. Um ícone escolhido pelo usuário não altera o driver físico.
Os 64 tipos definidos no catálogo oficial
Selecione qualquer item para consultar os campos válidos, os comandos definidos e exemplos de declaração e estado. Todos os exemplos abaixo são sintéticos, derivados do catálogo V2 anexado, sem prometer suporte físico a todos os sensores. Em um firmware real, registre apenas os tipos que efetivamente implementou.
64 tipos de contrato
01switchacionamento · toggle+
Campos de estado: power, actuation_mode, pulse_duration_ms
Comandos de catálogo: set_power, toggle, pulse, set_mode
{
"component": {
"id": "switch_1",
"type": "switch",
"name": "Exemplo switch",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"actuation_mode": "latch",
"pulse_duration_ms": 50
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
02outletacionamento · toggle+
Campos de estado: power
Comandos de catálogo: set_power
{
"component": {
"id": "outlet_1",
"type": "outlet",
"name": "Exemplo outlet",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
03relay_pulseacionamento · pulse+
Campos de estado: power
Comandos de catálogo: pulse
{
"component": {
"id": "relay_pulse_1",
"type": "relay_pulse",
"name": "Exemplo relay_pulse",
"commands": [
"pulse"
]
},
"state": {
"state": {
"power": false
},
"quality": "valid"
},
"command": {
"command": "pulse",
"args": {
"duration_ms": 50
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
04multi_switchacionamento · multi-toggle+
Campos de estado: channels
Comandos de catálogo: set_channel_power
{
"component": {
"id": "multi_switch_1",
"type": "multi_switch",
"name": "Exemplo multi_switch",
"commands": [
"set_channel_power"
]
},
"state": {
"state": {
"channels": {}
},
"quality": "valid"
},
"command": {
"command": "set_channel_power",
"args": {
"channel": 10,
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
05fanacionamento · fan+
Campos de estado: power, speed
Comandos de catálogo: set_power, set_speed
{
"component": {
"id": "fan_1",
"type": "fan",
"name": "Exemplo fan",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"speed": 23.5
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
06motoracionamento · motor+
Campos de estado: power, speed, fault
Comandos de catálogo: set_power, set_speed
{
"component": {
"id": "motor_1",
"type": "motor",
"name": "Exemplo motor",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"speed": 23.5,
"fault": false
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
07pumpacionamento · pump+
Campos de estado: power, fault
Comandos de catálogo: set_power
{
"component": {
"id": "pump_1",
"type": "pump",
"name": "Exemplo pump",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"fault": false
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
08valveacionamento · valve+
Campos de estado: open
Comandos de catálogo: set_open
{
"component": {
"id": "valve_1",
"type": "valve",
"name": "Exemplo valve",
"commands": [
"set_open"
]
},
"state": {
"state": {
"open": false
},
"quality": "valid"
},
"command": {
"command": "set_open",
"args": {
"open": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
09binary_sensoracionamento · binary-indicator+
Campos de estado: active
Comandos de catálogo: Somente leitura
{
"component": {
"id": "binary_sensor_1",
"type": "binary_sensor",
"name": "Exemplo binary_sensor",
"commands": []
},
"state": {
"state": {
"active": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
10light_rgbiluminacao · color-brightness+
Campos de estado: power, r, g, b, brightness
Comandos de catálogo: set_power, set_rgb, set_brightness
{
"component": {
"id": "light_rgb_1",
"type": "light_rgb",
"name": "Exemplo light_rgb",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"r": 10,
"g": 10,
"b": 10,
"brightness": 10
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
11light_rgbwiluminacao · color-brightness-white+
Campos de estado: power, r, g, b, w, brightness
Comandos de catálogo: set_power, set_rgbw, set_brightness
{
"component": {
"id": "light_rgbw_1",
"type": "light_rgbw",
"name": "Exemplo light_rgbw",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"r": 10,
"g": 10,
"b": 10,
"w": 10,
"brightness": 10
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
12light_cctiluminacao · color-temperature+
Campos de estado: power, kelvin, brightness
Comandos de catálogo: set_power, set_brightness, set_color_temperature
{
"component": {
"id": "light_cct_1",
"type": "light_cct",
"name": "Exemplo light_cct",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"kelvin": 1000,
"brightness": 10
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
13light_addressableiluminacao · effects+
Campos de estado: power, effect, brightness
Comandos de catálogo: set_power, set_effect, set_brightness
{
"component": {
"id": "light_addressable_1",
"type": "light_addressable",
"name": "Exemplo light_addressable",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"effect": "exemplo",
"brightness": 10
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
14dimmeriluminacao · slider+
Campos de estado: power, level
Comandos de catálogo: set_power, set_level
{
"component": {
"id": "dimmer_1",
"type": "dimmer",
"name": "Exemplo dimmer",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"level": 23.5
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
15temperatureclimatizacao · gauge+
Campos de estado: temperature_c
Comandos de catálogo: Somente leitura
{
"component": {
"id": "temperature_1",
"type": "temperature",
"name": "Exemplo temperature",
"commands": []
},
"state": {
"state": {
"temperature_c": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
16humidityclimatizacao · gauge+
Campos de estado: humidity_pct
Comandos de catálogo: Somente leitura
{
"component": {
"id": "humidity_1",
"type": "humidity",
"name": "Exemplo humidity",
"commands": []
},
"state": {
"state": {
"humidity_pct": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
17thermostatclimatizacao · thermostat+
Campos de estado: temperature_c, target_temperature_c, mode
Comandos de catálogo: set_mode, set_target_temperature
{
"component": {
"id": "thermostat_1",
"type": "thermostat",
"name": "Exemplo thermostat",
"commands": [
"set_mode"
]
},
"state": {
"state": {
"temperature_c": 23.5,
"target_temperature_c": 23.5,
"mode": "off"
},
"quality": "valid"
},
"command": {
"command": "set_mode",
"args": {
"mode": "off"
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
18humidity_controllerclimatizacao · setpoint+
Campos de estado: humidity_pct, target_humidity_pct
Comandos de catálogo: set_target_humidity
{
"component": {
"id": "humidity_controller_1",
"type": "humidity_controller",
"name": "Exemplo humidity_controller",
"commands": [
"set_target_humidity"
]
},
"state": {
"state": {
"humidity_pct": 23.5,
"target_humidity_pct": 23.5
},
"quality": "valid"
},
"command": {
"command": "set_target_humidity",
"args": {
"humidity_pct": 23.5
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
19heaterclimatizacao · setpoint+
Campos de estado: power, temperature_c, target_temperature_c
Comandos de catálogo: set_power, set_target_temperature
{
"component": {
"id": "heater_1",
"type": "heater",
"name": "Exemplo heater",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"temperature_c": 23.5,
"target_temperature_c": 23.5
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
20air_conditionerclimatizacao · hvac+
Campos de estado: power, temperature_c, target_temperature_c, mode
Comandos de catálogo: set_mode, set_target_temperature
{
"component": {
"id": "air_conditioner_1",
"type": "air_conditioner",
"name": "Exemplo air_conditioner",
"commands": [
"set_mode"
]
},
"state": {
"state": {
"power": false,
"temperature_c": 23.5,
"target_temperature_c": 23.5,
"mode": "off"
},
"quality": "valid"
},
"command": {
"command": "set_mode",
"args": {
"mode": "off"
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
21hvac_fanclimatizacao · fan+
Campos de estado: speed
Comandos de catálogo: set_speed
{
"component": {
"id": "hvac_fan_1",
"type": "hvac_fan",
"name": "Exemplo hvac_fan",
"commands": [
"set_speed"
]
},
"state": {
"state": {
"speed": 23.5
},
"quality": "valid"
},
"command": {
"command": "set_speed",
"args": {
"speed": 23.5
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
22temperature_probeclimatizacao · gauge+
Campos de estado: temperature_c
Comandos de catálogo: Somente leitura
{
"component": {
"id": "temperature_probe_1",
"type": "temperature_probe",
"name": "Exemplo temperature_probe",
"commands": []
},
"state": {
"state": {
"temperature_c": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
23coveraberturas · open-close-stop+
Campos de estado: status, direction
Comandos de catálogo: open, close, stop
{
"component": {
"id": "cover_1",
"type": "cover",
"name": "Exemplo cover",
"commands": [
"open"
]
},
"state": {
"state": {
"status": "idle",
"direction": "opening"
},
"quality": "valid"
},
"command": {
"command": "open",
"args": {}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
24cover_positionaberturas · position+
Campos de estado: position, moving
Comandos de catálogo: set_position, stop
{
"component": {
"id": "cover_position_1",
"type": "cover_position",
"name": "Exemplo cover_position",
"commands": [
"set_position"
]
},
"state": {
"state": {
"position": 23.5,
"moving": false
},
"quality": "valid"
},
"command": {
"command": "set_position",
"args": {
"position": 23.5
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
25door_sensoraberturas · binary-indicator+
Campos de estado: open
Comandos de catálogo: Somente leitura
{
"component": {
"id": "door_sensor_1",
"type": "door_sensor",
"name": "Exemplo door_sensor",
"commands": []
},
"state": {
"state": {
"open": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
26window_sensoraberturas · binary-indicator+
Campos de estado: open
Comandos de catálogo: Somente leitura
{
"component": {
"id": "window_sensor_1",
"type": "window_sensor",
"name": "Exemplo window_sensor",
"commands": []
},
"state": {
"state": {
"open": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
27motionambiente · binary-indicator+
Campos de estado: detected
Comandos de catálogo: Somente leitura
{
"component": {
"id": "motion_1",
"type": "motion",
"name": "Exemplo motion",
"commands": []
},
"state": {
"state": {
"detected": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
28presenceambiente · binary-indicator+
Campos de estado: detected
Comandos de catálogo: Somente leitura
{
"component": {
"id": "presence_1",
"type": "presence",
"name": "Exemplo presence",
"commands": []
},
"state": {
"state": {
"detected": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
29smokeambiente · alarm+
Campos de estado: alarm
Comandos de catálogo: Somente leitura
{
"component": {
"id": "smoke_1",
"type": "smoke",
"name": "Exemplo smoke",
"commands": []
},
"state": {
"state": {
"alarm": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
30gasambiente · alarm+
Campos de estado: alarm
Comandos de catálogo: Somente leitura
{
"component": {
"id": "gas_1",
"type": "gas",
"name": "Exemplo gas",
"commands": []
},
"state": {
"state": {
"alarm": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
31water_leakambiente · alarm+
Campos de estado: alarm
Comandos de catálogo: Somente leitura
{
"component": {
"id": "water_leak_1",
"type": "water_leak",
"name": "Exemplo water_leak",
"commands": []
},
"state": {
"state": {
"alarm": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
32co2ambiente · gauge+
Campos de estado: co2_ppm
Comandos de catálogo: Somente leitura
{
"component": {
"id": "co2_1",
"type": "co2",
"name": "Exemplo co2",
"commands": []
},
"state": {
"state": {
"co2_ppm": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
33illuminanceambiente · gauge+
Campos de estado: lux
Comandos de catálogo: Somente leitura
{
"component": {
"id": "illuminance_1",
"type": "illuminance",
"name": "Exemplo illuminance",
"commands": []
},
"state": {
"state": {
"lux": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
34air_qualityambiente · air-quality+
Campos de estado: value
Comandos de catálogo: Somente leitura
{
"component": {
"id": "air_quality_1",
"type": "air_quality",
"name": "Exemplo air_quality",
"commands": []
},
"state": {
"state": {
"value": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
35batteryambiente · battery+
Campos de estado: battery_pct
Comandos de catálogo: Somente leitura
{
"component": {
"id": "battery_1",
"type": "battery",
"name": "Exemplo battery",
"commands": []
},
"state": {
"state": {
"battery_pct": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
36soil_moistureambiente · gauge+
Campos de estado: humidity_pct
Comandos de catálogo: Somente leitura
{
"component": {
"id": "soil_moisture_1",
"type": "soil_moisture",
"name": "Exemplo soil_moisture",
"commands": []
},
"state": {
"state": {
"humidity_pct": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
37rain_sensorambiente · binary-indicator+
Campos de estado: active
Comandos de catálogo: Somente leitura
{
"component": {
"id": "rain_sensor_1",
"type": "rain_sensor",
"name": "Exemplo rain_sensor",
"commands": []
},
"state": {
"state": {
"active": false
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
38tank_levelagua · tank+
Campos de estado: level_pct
Comandos de catálogo: Somente leitura
{
"component": {
"id": "tank_level_1",
"type": "tank_level",
"name": "Exemplo tank_level",
"commands": []
},
"state": {
"state": {
"level_pct": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
39flow_meteragua · gauge+
Campos de estado: flow_l_min
Comandos de catálogo: Somente leitura
{
"component": {
"id": "flow_meter_1",
"type": "flow_meter",
"name": "Exemplo flow_meter",
"commands": []
},
"state": {
"state": {
"flow_l_min": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
40water_meteragua · counter+
Campos de estado: volume_l
Comandos de catálogo: Somente leitura
{
"component": {
"id": "water_meter_1",
"type": "water_meter",
"name": "Exemplo water_meter",
"commands": []
},
"state": {
"state": {
"volume_l": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
41pressureagua · gauge+
Campos de estado: pressure_kpa
Comandos de catálogo: Somente leitura
{
"component": {
"id": "pressure_1",
"type": "pressure",
"name": "Exemplo pressure",
"commands": []
},
"state": {
"state": {
"pressure_kpa": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
42irrigation_zoneagua · schedule+
Campos de estado: enabled
Comandos de catálogo: set_enabled
{
"component": {
"id": "irrigation_zone_1",
"type": "irrigation_zone",
"name": "Exemplo irrigation_zone",
"commands": [
"set_enabled"
]
},
"state": {
"state": {
"enabled": false
},
"quality": "valid"
},
"command": {
"command": "set_enabled",
"args": {
"enabled": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
43energy_meterenergia · energy+
Campos de estado: voltage_v, current_a, power_w, energy_kwh, frequency_hz, power_factor
Comandos de catálogo: Somente leitura
{
"component": {
"id": "energy_meter_1",
"type": "energy_meter",
"name": "Exemplo energy_meter",
"commands": []
},
"state": {
"state": {
"voltage_v": 23.5,
"current_a": 23.5,
"power_w": 23.5,
"energy_kwh": 23.5,
"frequency_hz": 23.5,
"power_factor": 1
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
44voltageenergia · gauge+
Campos de estado: voltage_v
Comandos de catálogo: Somente leitura
{
"component": {
"id": "voltage_1",
"type": "voltage",
"name": "Exemplo voltage",
"commands": []
},
"state": {
"state": {
"voltage_v": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
45currentenergia · gauge+
Campos de estado: current_a
Comandos de catálogo: Somente leitura
{
"component": {
"id": "current_1",
"type": "current",
"name": "Exemplo current",
"commands": []
},
"state": {
"state": {
"current_a": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
46powerenergia · gauge+
Campos de estado: power_w
Comandos de catálogo: Somente leitura
{
"component": {
"id": "power_1",
"type": "power",
"name": "Exemplo power",
"commands": []
},
"state": {
"state": {
"power_w": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
47frequencyenergia · gauge+
Campos de estado: frequency_hz
Comandos de catálogo: Somente leitura
{
"component": {
"id": "frequency_1",
"type": "frequency",
"name": "Exemplo frequency",
"commands": []
},
"state": {
"state": {
"frequency_hz": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
48power_factorenergia · gauge+
Campos de estado: power_factor
Comandos de catálogo: Somente leitura
{
"component": {
"id": "power_factor_1",
"type": "power_factor",
"name": "Exemplo power_factor",
"commands": []
},
"state": {
"state": {
"power_factor": 1
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
49solar_inverterenergia · solar+
Campos de estado: power_w, energy_kwh
Comandos de catálogo: Somente leitura
{
"component": {
"id": "solar_inverter_1",
"type": "solar_inverter",
"name": "Exemplo solar_inverter",
"commands": []
},
"state": {
"state": {
"power_w": 23.5,
"energy_kwh": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
50upsenergia · battery+
Campos de estado: battery_pct, power_w
Comandos de catálogo: Somente leitura
{
"component": {
"id": "ups_1",
"type": "ups",
"name": "Exemplo ups",
"commands": []
},
"state": {
"state": {
"battery_pct": 23.5,
"power_w": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
51vfdindustrial · vfd+
Campos de estado: speed, frequency_hz, fault, status
Comandos de catálogo: set_speed, stop
{
"component": {
"id": "vfd_1",
"type": "vfd",
"name": "Exemplo vfd",
"commands": [
"set_speed"
]
},
"state": {
"state": {
"speed": 23.5,
"frequency_hz": 23.5,
"fault": false,
"status": "idle"
},
"quality": "valid"
},
"command": {
"command": "set_speed",
"args": {
"speed": 23.5
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
52counterindustrial · counter+
Campos de estado: count
Comandos de catálogo: Somente leitura
{
"component": {
"id": "counter_1",
"type": "counter",
"name": "Exemplo counter",
"commands": []
},
"state": {
"state": {
"count": 10
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
53analog_inputindustrial · gauge+
Campos de estado: value
Comandos de catálogo: Somente leitura
{
"component": {
"id": "analog_input_1",
"type": "analog_input",
"name": "Exemplo analog_input",
"commands": []
},
"state": {
"state": {
"value": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
54analog_outputindustrial · slider+
Campos de estado: value
Comandos de catálogo: set_value
{
"component": {
"id": "analog_output_1",
"type": "analog_output",
"name": "Exemplo analog_output",
"commands": [
"set_value"
]
},
"state": {
"state": {
"value": 23.5
},
"quality": "valid"
},
"command": {
"command": "set_value",
"args": {
"value": 23.5
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
55rf_433_receiverrf433 · rf-events+
Campos de estado: last_event, received_at
Comandos de catálogo: Somente leitura
{
"component": {
"id": "rf_433_receiver_1",
"type": "rf_433_receiver",
"name": "Exemplo rf_433_receiver",
"commands": []
},
"state": {
"state": {
"last_event": "exemplo",
"received_at": "2026-10-30T18:00:00Z"
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
56rf_433_transmitterrf433 · rf-send+
Campos de estado: last_command_status
Comandos de catálogo: send_preset
{
"component": {
"id": "rf_433_transmitter_1",
"type": "rf_433_transmitter",
"name": "Exemplo rf_433_transmitter",
"commands": [
"send_preset"
]
},
"state": {
"state": {
"last_command_status": "queued"
},
"quality": "valid"
},
"command": {
"command": "send_preset",
"args": {
"preset_id": "exemplo"
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
57rf_433_remoterf433 · remote+
Campos de estado: button, pressed_at
Comandos de catálogo: Somente leitura
{
"component": {
"id": "rf_433_remote_1",
"type": "rf_433_remote",
"name": "Exemplo rf_433_remote",
"commands": []
},
"state": {
"state": {
"button": "exemplo",
"pressed_at": "2026-10-30T18:00:00Z"
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
58rf_433_sensorrf433 · sensor+
Campos de estado: value, received_at
Comandos de catálogo: Somente leitura
{
"component": {
"id": "rf_433_sensor_1",
"type": "rf_433_sensor",
"name": "Exemplo rf_433_sensor",
"commands": []
},
"state": {
"state": {
"value": 23.5,
"received_at": "2026-10-30T18:00:00Z"
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
59rf_433_gatewayrf433 · gateway+
Campos de estado: online, nodes_online
Comandos de catálogo: Somente leitura
{
"component": {
"id": "rf_433_gateway_1",
"type": "rf_433_gateway",
"name": "Exemplo rf_433_gateway",
"commands": []
},
"state": {
"state": {
"online": false,
"nodes_online": 10
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
60lora_nodelora · node+
Campos de estado: online, last_seen, rssi_dbm, snr_db
Comandos de catálogo: Somente leitura
{
"component": {
"id": "lora_node_1",
"type": "lora_node",
"name": "Exemplo lora_node",
"commands": []
},
"state": {
"state": {
"online": false,
"last_seen": "2026-10-30T18:00:00Z",
"rssi_dbm": 23.5,
"snr_db": 23.5
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
61lora_gatewaylora · gateway+
Campos de estado: online, nodes_online
Comandos de catálogo: Somente leitura
{
"component": {
"id": "lora_gateway_1",
"type": "lora_gateway",
"name": "Exemplo lora_gateway",
"commands": []
},
"state": {
"state": {
"online": false,
"nodes_online": 10
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
62lora_sensorlora · sensor+
Campos de estado: value, received_at
Comandos de catálogo: Somente leitura
{
"component": {
"id": "lora_sensor_1",
"type": "lora_sensor",
"name": "Exemplo lora_sensor",
"commands": []
},
"state": {
"state": {
"value": 23.5,
"received_at": "2026-10-30T18:00:00Z"
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
63lora_actuatorlora · remote-actuator+
Campos de estado: power, last_seen
Comandos de catálogo: set_power
{
"component": {
"id": "lora_actuator_1",
"type": "lora_actuator",
"name": "Exemplo lora_actuator",
"commands": [
"set_power"
]
},
"state": {
"state": {
"power": false,
"last_seen": "2026-10-30T18:00:00Z"
},
"quality": "valid"
},
"command": {
"command": "set_power",
"args": {
"power": false
}
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
64lora_linklora · signal+
Campos de estado: rssi_dbm, snr_db, last_seen
Comandos de catálogo: Somente leitura
{
"component": {
"id": "lora_link_1",
"type": "lora_link",
"name": "Exemplo lora_link",
"commands": []
},
"state": {
"state": {
"rssi_dbm": 23.5,
"snr_db": 23.5,
"last_seen": "2026-10-30T18:00:00Z"
},
"quality": "valid"
}
}Exemplo composto de referência — não é uma mensagem MQTT única nem confirma driver físico ou integração pronta.
Checklist de integração e resolução de problemas
Antes de parear
- Projeto compila com ESP-IDF no alvo correto.
- GPIOs e periféricos validados para a placa específica.
- Identidade e ativação geradas pelo processo autorizado.
- Bluetooth anunciando o nome do QR e Security 1.
- Certificados/credenciais guardados fora do repositório público.
Depois de conectar
- O MQTT/TLS conecta e o servidor autoriza o dispositivo.
- Manifesto QoS 1 aceito com PUBACK.
- IDs estáveis e tipos presentes no catálogo.
- Estados válidos correspondem aos sensores/atuadores reais.
- Comandos são autorizados, deduplicados e confirmados.
| Sintoma | O que conferir primeiro |
|---|---|
| QR recusado | Protocolo TechRib, URL oficial de ativação, formato de PoP e QR vigente. |
| BLE não encontra o ESP32 | Modo de pareamento, nome anunciado, permissões Bluetooth, chip e firmware. |
| Dispositivo conecta, mas não aparecem cards | Autorização, tópico telemetry, manifesto, PUBACK, tipos e IDs. |
| Sensor apresenta valor incorreto | Calibração, driver, campo, unidade, estado válido e leitura física. |
| Comando chega, mas o card não atualiza | ACK executado e estado posterior no tópico state. |
| RGB não oferece controle de cores | Tipo light_rgb e comandos set_rgb/set_brightness declarados. |
| Modbus sem resposta | Perfis reais dos módulos, parâmetros seriais, FC suportada e offset correto. |
Boas práticas de segurança, privacidade e publicação
- Não publique firmware completo, certificados privados, chaves MQTT, tokens de ativação, PoP reais, endereços internos nem arquivos de configuração sensíveis.
- Use MQTT/TLS com identidade de dispositivo, ACL e autorização no backend.
- Credenciais de rede não devem aparecer em exemplos, páginas, repositórios ou logs públicos.
- Não assuma que um tipo do catálogo permite controlar a função: o manifesto e a autorização também precisam permitir.
- Firmware de persianas e motores precisa de intertravamentos locais independentes do cloud.
- Validar instalação elétrica e qualquer equipamento de potência requer profissional habilitado; estes exemplos se limitam a software e estados lógicos.
- Em homologação, comece com componentes simulados e cargas não perigosas; só comunique status de produção após testes com hardware real.
Esta documentação é pública e orientada a desenvolvedores e integradores. Serviços de provisionamento, certificados, credenciais e recursos administrativos permanecem sob controle da TechRib e de cada empresa autorizada.
Comece pela sua placa e evolua gradualmente.
Escolha um componente, implemente o driver e valide seu estado. Depois, faça o provisionamento autorizado e teste o fluxo completo de ponta a ponta.
Solicitar cadastro empresarialConhecer a demonstração