DEV Community

Cover image for DeviceScript - Temperature + MQTT
Peli de Halleux
Peli de Halleux

Posted on • Originally published at microsoft.github.io

2

DeviceScript - Temperature + MQTT

This article uses an ESP32-C3 board Adafruit QT Py C3
and a SHTC3 sensor to publish a temperature reading to
the Adafruit.io MQTT APIs every minute using DeviceScript.

DeviceScript

DeviceScript brings JavaScript/TypeScript to tiny IoT devices such as the ESP32. DeviceScript provides a user friendly editing/debugging experience in Visual Studio Code.

Reading temperature

We start by configuring the script for the QT Py and adding a scheduled interval to read the temperature
from the SHTC3 sensor every 60 seconds.

// hardware configuration and drivers
import "@dsboard/adafruit_qt_py_c3"
import { startSHTC3 } from "@devicescript/drivers"
import { schedule } from "@devicescript/runtime"

// mounting a temperature server for the SHTC3 sensor
const { temperature } = await startSHTC3()

schedule(
    async () => {
        // read data from temperature sensor
        const value = await temperature.reading.read()
    },
    { timeout: 1000, interval: 60000 }
)
Enter fullscreen mode Exit fullscreen mode

Configuration and Secrets

To connect to Adafruit.io, you will to get an account with https://io.adafruit.com
and store your username and password in the settings
as the IO_USERNAME and IO_KEY keys (make sure your key is in env.local).
Also create a feed and update the feed key in the example below.

import { readSetting } from "@devicescript/settings"

// TODO: update feed key
const feed = "temperature"
const username = await readSetting("IO_USERNAME")
// this secret is stored in the .env.local 
// and uploaded to the device settings
const password = await readSetting("IO_KEY")
Enter fullscreen mode Exit fullscreen mode

Starting the MQTT client

Following the Adafruit documentation,
we start a MQTT connection and craft a topic that will route the data to our account.

import { startMQTTClient } from "@devicescript/net"

...

const mqtt = await startMQTTClient({
    host: `io.adafruit.com`,
    proto: "tls",
    port: 8883,
    username,
    password,
})
const topic = `${username}/feeds/${feed}/json`
Enter fullscreen mode Exit fullscreen mode

Publish data

With the MQTT client and the topic, we can add a call to mqtt.publish in the scheduled worker
to upload the data to Adafruit (note that { value } expands to JSON { "value": value } automatically)

schedule(
    async () => {        
        ...
        // publish data to Adafruit
        await mqtt.publish(topic, { value })
    },
    { timeout: 1000, interval: 60000 }
)
Enter fullscreen mode Exit fullscreen mode

All together

Putting all the pieces together we get the following program.

import "@dsboard/adafruit_qt_py_c3"
import { startSHTC3 } from "@devicescript/drivers"
import { startMQTTClient } from "@devicescript/net"
import { readSetting } from "@devicescript/settings"
import { schedule } from "@devicescript/runtime"

const { temperature } = await startSHTC3()

const feed = "temperature"
const username = await readSetting("IO_USERNAME")
device settings
const password = await readSetting("IO_KEY")

const mqtt = await startMQTTClient({
    host: `io.adafruit.com`,
    proto: "tls",
    port: 8883,
    username,
    password,
})
const topic = `${username}/feeds/${feed}/json`

schedule(
    async () => {
        const value = await temperature.reading.read()
        await mqtt.publish(topic, { value })
    },
    { timeout: 1000, interval: 60000 }
)
Enter fullscreen mode Exit fullscreen mode

Extra points: Filtering data

You could use observables to smooth the sensor
data. For example, apply an exponentially moving average
on the feed of temperature readings.

import { ewma, auditTime } from "@devicescript/observables"
...
temperature.reading
    .pipe(ewma(0.5), auditTime(60000))
    .subscribe(async value => await mqtt.publish(topic, { value }))
Enter fullscreen mode Exit fullscreen mode

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs