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.

01 · VISÃO GERAL

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.

Dispositivo ESP32Firmware, GPIO, sensores, MQTT/TLS, BLE e identidade
↕
TechRib IoT CloudAutorização, catálogo V2, estados, comandos
↕
App e dashboardCards gerados por tipo, estado e permissões

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.

02 · AMBIENTE

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.

ESTRUTURA
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
# 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.

C
// 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.
03 · PRIMEIRO ACESSO

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.

  1. Prepare a conta: a empresa e o usuário precisam ter acesso autorizado à plataforma.
  2. Coloque a placa em modo de pareamento: o firmware anuncia BLE com o nome previsto para a família ESP32.
  3. Abra a inclusão de dispositivos no app: habilite Bluetooth e as permissões solicitadas pelo Android.
  4. Escaneie o QR oficial da TechRib: o aplicativo valida o protocolo, o host de ativação, a identidade BLE e o PoP.
  5. 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.
  6. 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.
  7. 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.

JSON (DIDÁTICO — NÃO UTILIZAR PARA ATIVAÇÃO)
{
  "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.

04 · PROTOCOLO

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.

MQTT
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 entrada

Os 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.

05 · INVENTÁRIO

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.

JSON
{
  "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.

06 · TELEMETRIA

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.

JSON
{
  "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.

07 · CONTROLE

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.

JSON
{
  "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.

JSON
{
  "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": {}
}
08 · SAÍDAS

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.

FRAGMENTOS JSON
{"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.

FRAGMENTOS JSON
{"id":"campainha_1","type":"relay_pulse","name":"Pulso 1",
 "transport":"local","commands":["pulse"]}
{"command":"pulse","args":{"duration_ms":500}}
09 · COR E ILUMINAÇÃO

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.

FRAGMENTOS JSON
{"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.

LÓGICA DIDÁTICA
// 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");
}
10 · ENTRADAS E MEDIÇÕES

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.

FRAGMENTOS ILUSTRATIVOS
{"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.

11 · MOVIMENTO

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.

FRAGMENTOS JSON
{"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.

12 · RS485

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.

CONFIGURAÇÃO LÓGICA
# 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:toggle

Esse 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.

13 · APLICATIVO

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 manifestoComponente visual padrão (Flutter)Card/controle esperado
switch, outletAlternância / toggleLigar e desligar, se set_power declarado
light_rgb, light_rgbw, light_addressablePaletaCor, brilho e estado conforme comandos
temperature, temperature_probeTermômetroLeitura de temperatura
humidity, humidity_controllerGotaUmidade
presence, motionSensorIndicador de presença
door_sensor, window_sensorPortaAberta/fechada
cover, cover_positionPersianaSubir, descer, parar ou posição, conforme tipo
motor, vfdMotorControle do motor
energy_meter, power, voltage, currentRaio/energiaMedidas elétricas
rf_433_*, lora_*AntenaTelemetria e controles autorizados
Demais mediçõesMonitor/sensorLeitura 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.

14 · REFERÊNCIA

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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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

JSON · EXEMPLO DIDÁTICO
{
  "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.

15 · TESTES

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.
SintomaO que conferir primeiro
QR recusadoProtocolo TechRib, URL oficial de ativação, formato de PoP e QR vigente.
BLE não encontra o ESP32Modo de pareamento, nome anunciado, permissões Bluetooth, chip e firmware.
Dispositivo conecta, mas não aparecem cardsAutorização, tópico telemetry, manifesto, PUBACK, tipos e IDs.
Sensor apresenta valor incorretoCalibração, driver, campo, unidade, estado válido e leitura física.
Comando chega, mas o card não atualizaACK executado e estado posterior no tópico state.
RGB não oferece controle de coresTipo light_rgb e comandos set_rgb/set_brightness declarados.
Modbus sem respostaPerfis reais dos módulos, parâmetros seriais, FC suportada e offset correto.
16 · RESPONSABILIDADE

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