Skip to content

Code examples ​

Complete programs that send data to INCLUDE, in each common language and board. Pick the language tab, copy, replace the marked values, and run it.

Every example on this page is run exactly as published against a copy of the INCLUDE platform before it goes out, over HTTPS, MQTT on port 1883, and MQTT with TLS on port 8883, and each one must produce a reading in the database. The Arduino sketches are compiled for their boards (ESP32 core 3.3, ESP8266 core 3.1).

What to replace ​

In the codeReplace with
YOUR_DEVICE_TOKENDevice Token from the Koneksi & Integrasi screen
YOUR_DEVICE_IDThe device ID (the MQTT username on the same screen)
YOUR_ORG_IDThe second part of Topik telemetri, your Organisation ID
YOUR_SOLUTION_SLUGThe third part of Topik telemetri, for example custom
WIFI_SSID, WIFI_PASSWORDWiFi name and password (boards only)

Quicker: open your device's Koneksi & Integrasi screen, section Code examples. The same code is there with that device's token and IDs already filled in.

The Code examples section on the Koneksi & Integrasi screen

HTTP ​

One POST request per reading. Suits devices that send now and then, and is the easiest to try. Details: Sending data over HTTP.

cpp
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>

const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry";

// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char* ROOT_CA = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";

WiFiClientSecure tls;

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("WiFi connected");
  tls.setCACert(ROOT_CA);
}

void loop() {
  float temperature = 25.4;  // replace with your sensor reading
  float humidity = 61;
  String body = "{\"temperature\": " + String(temperature, 1) +
                ", \"humidity\": " + String(humidity, 0) + "}";

  HTTPClient http;
  http.begin(tls, URL);
  http.addHeader("Content-Type", "application/json");
  int status = http.POST(body);
  Serial.printf("HTTP %d %s\n", status, http.getString().c_str());
  http.end();
  delay(10000);
}
cpp
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <time.h>

const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry";

// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char ROOT_CA[] PROGMEM = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";

BearSSL::X509List roots(ROOT_CA);
BearSSL::WiFiClientSecure tls;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("WiFi connected");

  // Certificate checks need the real time.
  configTime(0, 0, "pool.ntp.org", "time.google.com");
  while (time(nullptr) < 1700000000) delay(500);
  tls.setTrustAnchors(&roots);
}

void loop() {
  float temperature = 25.4;  // replace with your sensor reading
  float humidity = 61;
  String body = "{\"temperature\": " + String(temperature, 1) +
                ", \"humidity\": " + String(humidity, 0) + "}";

  HTTPClient http;
  http.begin(tls, URL);
  http.addHeader("Content-Type", "application/json");
  int status = http.POST(body);
  Serial.printf("HTTP %d %s\n", status, http.getString().c_str());
  http.end();
  delay(10000);
}
py
import time

import network
import requests

WIFI_SSID = "your-wifi"
WIFI_PASSWORD = "your-password"
URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
    time.sleep(0.5)
print("WiFi connected")


def read_sensor():
    # Replace with your sensor reading.
    return {"temperature": 25.4, "humidity": 61}


while True:
    try:
        r = requests.post(URL, json=read_sensor())
        print(r.status_code, r.text)
        r.close()
    except OSError as e:
        print("send failed:", e)
    time.sleep(10)
py
import time

import requests

URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"


def read_sensor():
    # Replace with your sensor reading.
    return {"temperature": 25.4, "humidity": 61}


while True:
    try:
        r = requests.post(URL, json=read_sensor(), timeout=10)
        print(r.status_code, r.text)
    except requests.RequestException as e:
        print("send failed:", e)
    time.sleep(10)
js
const URL = 'https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry';

function readSensor() {
  // Replace with your sensor reading.
  return { temperature: 25.4, humidity: 61 };
}

async function send() {
  try {
    const res = await fetch(URL, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(readSensor()),
    });
    console.log(res.status, await res.text());
  } catch (err) {
    console.error('send failed:', err.message);
  }
}

send();
setInterval(send, 10_000);
go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"time"
)

const url = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"

func readSensor() map[string]any {
	// Replace with your sensor reading.
	return map[string]any{"temperature": 25.4, "humidity": 61}
}

func main() {
	client := &http.Client{Timeout: 10 * time.Second}
	for {
		body, _ := json.Marshal(readSensor())
		res, err := client.Post(url, "application/json", bytes.NewReader(body))
		if err != nil {
			fmt.Println("send failed:", err)
		} else {
			reply, _ := io.ReadAll(res.Body)
			res.Body.Close()
			fmt.Println(res.StatusCode, string(reply))
		}
		time.Sleep(10 * time.Second)
	}
}
c
#include <stdio.h>
#include <unistd.h>
#include <curl/curl.h>

#define URL "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry"

int main(void) {
  curl_global_init(CURL_GLOBAL_DEFAULT);
  struct curl_slist *headers = curl_slist_append(NULL, "Content-Type: application/json");

  for (;;) {
    double temperature = 25.4; /* replace with your sensor reading */
    double humidity = 61;
    char body[128];
    snprintf(body, sizeof body, "{\"temperature\": %.1f, \"humidity\": %.0f}", temperature, humidity);

    CURL *curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
    CURLcode rc = curl_easy_perform(curl);
    if (rc == CURLE_OK) {
      long status = 0;
      curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
      printf("\nHTTP %ld\n", status);
    } else {
      fprintf(stderr, "send failed: %s\n", curl_easy_strerror(rc));
    }
    curl_easy_cleanup(curl);
    fflush(stdout);
    sleep(10);
  }
}
bash
curl -X POST https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry \
  -H "Content-Type: application/json" \
  -d '{"temperature": 25.4, "humidity": 61}'

MQTT ​

One connection that stays open. Suits devices that send often, and devices that receive commands from the platform. The examples below use port 1883, the easiest way. Details: Sending data over MQTT.

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

// MQTT on port 1883, the simplest way: no certificate needed.
// For an encrypted connection, choose port 8883 (TLS) instead.
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 1883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";

WiFiClient net;
PubSubClient mqtt(net);

void connectMqtt() {
  while (!mqtt.connected()) {
    if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
      Serial.println("MQTT connected");
    } else {
      Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("WiFi connected");
  mqtt.setServer(HOST, PORT);
  mqtt.setBufferSize(512);
}

void loop() {
  connectMqtt();
  mqtt.loop();

  float temperature = 25.4;  // replace with your sensor reading
  float humidity = 61;
  String payload = "{\"temperature\": " + String(temperature, 1) +
                   ", \"humidity\": " + String(humidity, 0) + "}";
  bool sent = mqtt.publish(TOPIC, payload.c_str());
  Serial.println(sent ? "sent" : "send failed");
  delay(10000);
}
cpp
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// MQTT on port 1883, the simplest way: no certificate needed.
// For an encrypted connection, choose port 8883 (TLS) instead.
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 1883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";

WiFiClient net;
PubSubClient mqtt(net);

void connectMqtt() {
  while (!mqtt.connected()) {
    if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
      Serial.println("MQTT connected");
    } else {
      Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("WiFi connected");
  mqtt.setServer(HOST, PORT);
  mqtt.setBufferSize(512);
}

void loop() {
  connectMqtt();
  mqtt.loop();

  float temperature = 25.4;  // replace with your sensor reading
  float humidity = 61;
  String payload = "{\"temperature\": " + String(temperature, 1) +
                   ", \"humidity\": " + String(humidity, 0) + "}";
  bool sent = mqtt.publish(TOPIC, payload.c_str());
  Serial.println(sent ? "sent" : "send failed");
  delay(10000);
}
py
import json
import time

import network
from umqtt.simple import MQTTClient

WIFI_SSID = "your-wifi"
WIFI_PASSWORD = "your-password"
HOST = "app.include.co.id"
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
    time.sleep(0.5)
print("WiFi connected")

client = MQTTClient(DEVICE_ID, HOST, port=1883, user=DEVICE_ID, password=DEVICE_TOKEN,
                    keepalive=60)
client.connect()
print("connected")


def read_sensor():
    # Replace with your sensor reading.
    return {"temperature": 25.4, "humidity": 61}


while True:
    client.publish(TOPIC, json.dumps(read_sensor()))
    print("sent")
    time.sleep(10)
py
import json
import time

import paho.mqtt.client as mqtt

HOST = "app.include.co.id"
PORT = 1883
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"


def read_sensor():
    # Replace with your sensor reading.
    return {"temperature": 25.4, "humidity": 61}


def on_connect(client, userdata, flags, reason_code, properties):
    print("connected:", reason_code)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=DEVICE_ID)
client.username_pw_set(DEVICE_ID, DEVICE_TOKEN)
client.on_connect = on_connect
client.connect(HOST, PORT)
client.loop_start()

while True:
    info = client.publish(TOPIC, json.dumps(read_sensor()), qos=1)
    info.wait_for_publish(timeout=10)
    print("sent:", info.is_published())
    time.sleep(10)
js
import mqtt from 'mqtt';

const DEVICE_ID = 'YOUR_DEVICE_ID';
const DEVICE_TOKEN = 'YOUR_DEVICE_TOKEN';
const TOPIC = 'includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry';

function readSensor() {
  // Replace with your sensor reading.
  return { temperature: 25.4, humidity: 61 };
}

const client = mqtt.connect('mqtt://app.include.co.id:1883', {
  clientId: DEVICE_ID,
  username: DEVICE_ID,
  password: DEVICE_TOKEN,
});

client.on('connect', () => {
  console.log('connected');
  const send = () =>
    client.publish(TOPIC, JSON.stringify(readSensor()), { qos: 1 }, err =>
      console.log(err ? `send failed: ${err.message}` : 'sent')
    );
  send();
  setInterval(send, 10_000);
});
client.on('error', err => console.error('mqtt error:', err.message));
go
package main

import (
	"encoding/json"
	"fmt"
	"time"

	mqtt "github.com/eclipse/paho.mqtt.golang"
)

const (
	broker      = "tcp://app.include.co.id:1883"
	deviceID    = "YOUR_DEVICE_ID"
	deviceToken = "YOUR_DEVICE_TOKEN"
	topic       = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
)

func readSensor() map[string]any {
	// Replace with your sensor reading.
	return map[string]any{"temperature": 25.4, "humidity": 61}
}

func main() {
	opts := mqtt.NewClientOptions().
		AddBroker(broker).
		SetClientID(deviceID).
		SetUsername(deviceID).
		SetPassword(deviceToken).
		SetAutoReconnect(true)
	client := mqtt.NewClient(opts)
	if t := client.Connect(); t.Wait() && t.Error() != nil {
		panic(t.Error())
	}
	fmt.Println("connected")

	for {
		payload, _ := json.Marshal(readSensor())
		t := client.Publish(topic, 1, false, payload)
		t.Wait()
		if t.Error() != nil {
			fmt.Println("send failed:", t.Error())
		} else {
			fmt.Println("sent")
		}
		time.Sleep(10 * time.Second)
	}
}
c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <mosquitto.h>

#define HOST "app.include.co.id"
#define PORT 1883
#define DEVICE_ID "YOUR_DEVICE_ID"
#define DEVICE_TOKEN "YOUR_DEVICE_TOKEN"
#define TOPIC "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"

int main(void) {
  mosquitto_lib_init();
  struct mosquitto *mosq = mosquitto_new(DEVICE_ID, true, NULL);
  mosquitto_username_pw_set(mosq, DEVICE_ID, DEVICE_TOKEN);

  int rc = mosquitto_connect(mosq, HOST, PORT, 60);
  if (rc != MOSQ_ERR_SUCCESS) {
    fprintf(stderr, "connect failed: %s\n", mosquitto_strerror(rc));
    return 1;
  }
  mosquitto_loop_start(mosq);
  printf("connected\n");

  for (;;) {
    double temperature = 25.4; /* replace with your sensor reading */
    double humidity = 61;
    char payload[128];
    snprintf(payload, sizeof payload, "{\"temperature\": %.1f, \"humidity\": %.0f}", temperature, humidity);
    rc = mosquitto_publish(mosq, NULL, TOPIC, (int)strlen(payload), payload, 1, false);
    printf(rc == MOSQ_ERR_SUCCESS ? "sent\n" : "send failed\n");
    fflush(stdout);
    sleep(10);
  }
}
bash
mosquitto_pub -h app.include.co.id -p 1883 \
  -i YOUR_DEVICE_ID -u YOUR_DEVICE_ID -P YOUR_DEVICE_TOKEN \
  -t includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry \
  -m '{"temperature": 25.4, "humidity": 61}'

With TLS (port 8883) ​

The connection and the token are encrypted. The ESP32 and ESP8266 sketches carry the server's root certificates, and the ESP8266 first gets the time from NTP.

cpp
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 8883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";

// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char* ROOT_CA = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";

WiFiClientSecure tls;
PubSubClient mqtt(tls);

void connectMqtt() {
  while (!mqtt.connected()) {
    if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
      Serial.println("MQTT connected");
    } else {
      Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("WiFi connected");
  tls.setCACert(ROOT_CA);
  mqtt.setServer(HOST, PORT);
  mqtt.setBufferSize(512);
}

void loop() {
  connectMqtt();
  mqtt.loop();

  float temperature = 25.4;  // replace with your sensor reading
  float humidity = 61;
  String payload = "{\"temperature\": " + String(temperature, 1) +
                   ", \"humidity\": " + String(humidity, 0) + "}";
  bool sent = mqtt.publish(TOPIC, payload.c_str());
  Serial.println(sent ? "sent" : "send failed");
  delay(10000);
}
cpp
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <time.h>

const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 8883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";

// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char ROOT_CA[] PROGMEM = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";

BearSSL::X509List roots(ROOT_CA);
BearSSL::WiFiClientSecure tls;
PubSubClient mqtt(tls);

void connectMqtt() {
  while (!mqtt.connected()) {
    if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
      Serial.println("MQTT connected");
    } else {
      Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("WiFi connected");

  // Certificate checks need the real time.
  configTime(0, 0, "pool.ntp.org", "time.google.com");
  while (time(nullptr) < 1700000000) delay(500);
  tls.setTrustAnchors(&roots);
  mqtt.setServer(HOST, PORT);
  mqtt.setBufferSize(512);
}

void loop() {
  connectMqtt();
  mqtt.loop();

  float temperature = 25.4;  // replace with your sensor reading
  float humidity = 61;
  String payload = "{\"temperature\": " + String(temperature, 1) +
                   ", \"humidity\": " + String(humidity, 0) + "}";
  bool sent = mqtt.publish(TOPIC, payload.c_str());
  Serial.println(sent ? "sent" : "send failed");
  delay(10000);
}
py
import json
import ssl
import time

import network
from umqtt.simple import MQTTClient

WIFI_SSID = "your-wifi"
WIFI_PASSWORD = "your-password"
HOST = "app.include.co.id"
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
    time.sleep(0.5)
print("WiFi connected")

context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.verify_mode = ssl.CERT_NONE
client = MQTTClient(DEVICE_ID, HOST, port=8883, user=DEVICE_ID, password=DEVICE_TOKEN,
                    keepalive=60, ssl=context)
client.connect()
print("connected")


def read_sensor():
    # Replace with your sensor reading.
    return {"temperature": 25.4, "humidity": 61}


while True:
    client.publish(TOPIC, json.dumps(read_sensor()))
    print("sent")
    time.sleep(10)
py
import json
import time

import paho.mqtt.client as mqtt

HOST = "app.include.co.id"
PORT = 8883
DEVICE_ID = "YOUR_DEVICE_ID"
DEVICE_TOKEN = "YOUR_DEVICE_TOKEN"
TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"


def read_sensor():
    # Replace with your sensor reading.
    return {"temperature": 25.4, "humidity": 61}


def on_connect(client, userdata, flags, reason_code, properties):
    print("connected:", reason_code)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=DEVICE_ID)
client.username_pw_set(DEVICE_ID, DEVICE_TOKEN)
client.tls_set()
client.on_connect = on_connect
client.connect(HOST, PORT)
client.loop_start()

while True:
    info = client.publish(TOPIC, json.dumps(read_sensor()), qos=1)
    info.wait_for_publish(timeout=10)
    print("sent:", info.is_published())
    time.sleep(10)
js
import mqtt from 'mqtt';

const DEVICE_ID = 'YOUR_DEVICE_ID';
const DEVICE_TOKEN = 'YOUR_DEVICE_TOKEN';
const TOPIC = 'includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry';

function readSensor() {
  // Replace with your sensor reading.
  return { temperature: 25.4, humidity: 61 };
}

const client = mqtt.connect('mqtts://app.include.co.id:8883', {
  clientId: DEVICE_ID,
  username: DEVICE_ID,
  password: DEVICE_TOKEN,
});

client.on('connect', () => {
  console.log('connected');
  const send = () =>
    client.publish(TOPIC, JSON.stringify(readSensor()), { qos: 1 }, err =>
      console.log(err ? `send failed: ${err.message}` : 'sent')
    );
  send();
  setInterval(send, 10_000);
});
client.on('error', err => console.error('mqtt error:', err.message));
go
package main

import (
	"encoding/json"
	"fmt"
	"time"

	mqtt "github.com/eclipse/paho.mqtt.golang"
)

const (
	broker      = "ssl://app.include.co.id:8883"
	deviceID    = "YOUR_DEVICE_ID"
	deviceToken = "YOUR_DEVICE_TOKEN"
	topic       = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"
)

func readSensor() map[string]any {
	// Replace with your sensor reading.
	return map[string]any{"temperature": 25.4, "humidity": 61}
}

func main() {
	opts := mqtt.NewClientOptions().
		AddBroker(broker).
		SetClientID(deviceID).
		SetUsername(deviceID).
		SetPassword(deviceToken).
		SetAutoReconnect(true)
	client := mqtt.NewClient(opts)
	if t := client.Connect(); t.Wait() && t.Error() != nil {
		panic(t.Error())
	}
	fmt.Println("connected")

	for {
		payload, _ := json.Marshal(readSensor())
		t := client.Publish(topic, 1, false, payload)
		t.Wait()
		if t.Error() != nil {
			fmt.Println("send failed:", t.Error())
		} else {
			fmt.Println("sent")
		}
		time.Sleep(10 * time.Second)
	}
}
c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <mosquitto.h>

#define HOST "app.include.co.id"
#define PORT 8883
#define DEVICE_ID "YOUR_DEVICE_ID"
#define DEVICE_TOKEN "YOUR_DEVICE_TOKEN"
#define TOPIC "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry"

int main(void) {
  mosquitto_lib_init();
  struct mosquitto *mosq = mosquitto_new(DEVICE_ID, true, NULL);
  mosquitto_username_pw_set(mosq, DEVICE_ID, DEVICE_TOKEN);
  mosquitto_tls_set(mosq, NULL, "/etc/ssl/certs", NULL, NULL, NULL);

  int rc = mosquitto_connect(mosq, HOST, PORT, 60);
  if (rc != MOSQ_ERR_SUCCESS) {
    fprintf(stderr, "connect failed: %s\n", mosquitto_strerror(rc));
    return 1;
  }
  mosquitto_loop_start(mosq);
  printf("connected\n");

  for (;;) {
    double temperature = 25.4; /* replace with your sensor reading */
    double humidity = 61;
    char payload[128];
    snprintf(payload, sizeof payload, "{\"temperature\": %.1f, \"humidity\": %.0f}", temperature, humidity);
    rc = mosquitto_publish(mosq, NULL, TOPIC, (int)strlen(payload), payload, 1, false);
    printf(rc == MOSQ_ERR_SUCCESS ? "sent\n" : "send failed\n");
    fflush(stdout);
    sleep(10);
  }
}
bash
mosquitto_pub -h app.include.co.id -p 8883 --capath /etc/ssl/certs \
  -i YOUR_DEVICE_ID -u YOUR_DEVICE_ID -P YOUR_DEVICE_TOKEN \
  -t includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry \
  -m '{"temperature": 25.4, "humidity": 61}'

Running each example ​

LanguageInstall firstRun
ESP32ESP32 board in Arduino IDE; MQTT: PubSubClientupload from Arduino IDE. Guide
ESP8266ESP8266 board; MQTT: PubSubClientupload from Arduino IDE. Guide
MicroPythonMicroPython firmware on the boardsave as main.py. Guide
Pythonpip install requests paho-mqttpython3 send.py
JavaScriptNode.js 18+; MQTT: npm install mqttnode send.mjs
GoMQTT: go get github.com/eclipse/paho.mqtt.golanggo run main.go
Clibcurl or libmosquitto (-dev package)cc send.c -lcurl -o send && ./send
curlalready on Linux, macOS, Windows 10+paste into a terminal

The Python, JavaScript, Go and C programs send one reading every 10 seconds until stopped with Ctrl+C. What success looks like:

  • HTTP: 202 {"ok":true}
  • MQTT: connected, then sent each time it sends

See Computers, servers and gateways to set up Python, Node.js, Go or C on Linux, macOS and Windows.

Changing what is sent ​

Each example reads its values in one place, read_sensor() or the line commented replace with your sensor reading. Put your sensor reading there. Each key becomes one device parameter:

json
{ "temperature": 25.4, "humidity": 61, "pump_on": true }

The rules for the body are in Sending data over HTTP.

INCLUDE AIoT Platform for Smart Industry