IoTsys

Documentacao

ESP32 e similares

Guia pratico para firmwares Arduino/PlatformIO conectarem ESP32, ESP32-C3, ESP8266 e gateways RF ao IoTsys.

Bibliotecas

lib_deps =
  knolleary/PubSubClient@^2.8
  bblanchon/ArduinoJson@^7.4.2
  sui77/rc-switch@^2.6.4

Config basica

#define WIFI_SSID "sua-rede"
#define WIFI_PASS "sua-senha"

#define MQTT_HOST "mqtt.iotsys.com.br"
#define MQTT_PORT 1883
#define MQTT_USERNAME "usuario_mqtt"
#define MQTT_PASSWORD "senha_mqtt"

#define TOPIC_COMMAND "tenants/{tenant_id}/devices/{device_id}/command"
#define TOPIC_STATE "tenants/{tenant_id}/devices/{device_id}/state"
#define TOPIC_AVAILABILITY "tenants/{tenant_id}/devices/{device_id}/availability"

Loop MQTT minimo

#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);

void publishState(const char *powerState) {
  StaticJsonDocument<128> doc;
  doc["power_state"] = powerState;

  char payload[128];
  size_t size = serializeJson(doc, payload);
  mqtt.publish(TOPIC_STATE, payload, size);
}

void onMessage(char *topic, byte *payload, unsigned int length) {
  StaticJsonDocument<256> doc;
  if (deserializeJson(doc, payload, length)) return;

  const char *type = doc["type"] | "";
  const char *value = doc["value"] | "";

  if (strcmp(type, "power") != 0) return;

  if (strcmp(value, "ON") == 0) {
    // acione relay, dimmer, RF, IR ou GPIO aqui
    publishState("ON");
  }

  if (strcmp(value, "OFF") == 0) {
    // desligue o hardware aqui
    publishState("OFF");
  }
}

Reconexao

void connectMqtt() {
  while (!mqtt.connected()) {
    String clientId = "iotsys-esp32-" + String((uint32_t)ESP.getEfuseMac(), HEX);

    if (mqtt.connect(clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD)) {
      mqtt.subscribe(TOPIC_COMMAND, 1);
      mqtt.publish(TOPIC_AVAILABILITY, "online", true);
      return;
    }

    delay(3000);
  }
}

void loop() {
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();
}

Checklist de producao

  • Use client ID unico por placa.
  • Configure watchdog para recuperar travamentos.
  • Reporte estado apenas apos confirmar a acao fisica.
  • Evite delay longo dentro do callback MQTT.
  • Separe credenciais por tenant, por dispositivo ou por gateway.
  • Para gateways RF/IR, publique estado conforme o comando enviado e registre limitacoes fisicas do equipamento.