Adding SiLabs EFR32BG27 to the Golioth Bluetooth-to-Cloud Service

If there’s one thing we love doing, it’s adding new chips to an IoT fleet. The Golioth Bluetooth-to-Cloud service is so hot right now because if your chip speaks BLE, we can connect it to the cloud. The Silicon Labs EFR32BG27 found on the xG27 development kit is the latest Bluetooth offering to be added to a Golioth fleet. Let’s jump in and discuss what it takes to enable SiLabs parts.

Using the EFR32BG27 with Zephyr

We grabbed the SiLabs xG27 dev kit for this experiment because it already has support in the Zephyr tree. Although support begins with v4.1.0 of Zephyr, our testing showed that for the device to work correctly with our gateways we needed to upgrade to v4.2.0.

Black rectangular development board about the size of two postage stamps with a white Silicon Labs logo on it.This board includes an embedded J-Link adapter so you can flash it using the USB-C port and Zephyr’s west flash command. To access the Bluetooth features of the chip, use west to grab the binary blob.

west blobs fetch hal_silabs

That takes care of the BLE prerequisites. I find that the Zephyr Bluetooth Observer sample is really handy when testing out new chips, so I built and ran that sample to confirm the radio was working as expected. Now it’s time to add this to our IoT fleet!

Building Golioth’s Bluetooth-to-Cloud Example

To get the SiLabs EFR32BG27 talking to the cloud I followed the instructions from the Golioth Bluetooth-to-Cloud connectivity repository. The example application is found in the Pouch non-IP protocol repository that is included as a submodule. I just needed to make a few updates to the pouch/west.yml manifest file in that repo so it will work with SiLabs parts:

  1. Use Zephyr v4.2.0
  2. Add the SiLabs HAL library to the allowlist
  3. Add cmsis_6 to the allowlist
# Copyright (c) 2025 Golioth, Inc.
# SPDX-License-Identifier: Apache-2.0

manifest:
  version: 0.8

  projects:
    - name: zephyr
      revision: v4.2.0
      url: https://github.com/zephyrproject-rtos/zephyr
      west-commands: scripts/west-commands.yml
      import:
        path-prefix: deps
        name-allowlist:
          - zephyr
          - cmsis
          - cmsis_6
          - hal_nordic
          - hal_silabs
          - mbedtls
          - mcuboot
          - segger
          - tfm-mcuboot
          - trusted-firmware-m
          - zcbor

Don’t forget to run west update after making these changes to pull in the new version and new library. Here’s what that looks like, including the step to download binary blobs.

west update
west blobs fetch hal_silabs

Next, build the example application. Don’t forget to replace the REPLACEME part with the Device ID from the Golioth console.

west build -p -b xg27_dk2602a pouch/examples/ble_gatt -- -DCONFIG_EXAMPLE_DEVICE_ID=\"REPLACEME\"
west flash

You should have already set up your gateway by following steps 1 and 2 from the getting started guide. If so, your newly flashed SiLabs board will soon be reporting into the cloud!

Golioth web console showing the SiLabs xg27_dk2602a connecting to the Gateway.Go Deeper with the SiLabs xG27

By default the Golioth example sends simulated temperature sensor data. But the xG27 dev board has a Si7210 sensor that includes a temperature reading. It’s far more fun to send actual sensor readings to the cloud so let’s update the sample to read that sensor!

First, create an overlay file to enable the sensor node which is already part of the in-tree Zephyr definition.

&i2c0 {
  si7210 {
    status = "okay";
  };
};

I also added some Kconfig symbols to get this sensor working. The SHELL-related symbols are optional:

CONFIG_I2C=y
CONFIG_I2C_SHELL=y
CONFIG_SENSOR=y
CONFIG_SENSOR_SHELL=y

From there it’s the simple matter of actually reading the sensor and sending it to Golioth.

const struct device *const temperature_dev = DEVICE_DT_GET_ANY(silabs_si7210);
#include <zephyr/drivers/sensor.h>

static void pouch_event_handler(enum pouch_event event, void *ctx)
{
    if (POUCH_EVENT_SESSION_START == event)
    {
        sensor_sample_fetch(temperature_dev);
        struct sensor_value temperature;
        sensor_channel_get(temperature_dev, SENSOR_CHAN_AMBIENT_TEMP, &temperature);

        char sbuf[64];
        snprintk(sbuf, sizeof(sbuf), "{\"temp\":%g}", sensor_value_to_double(&temperature));

        pouch_uplink_entry_write(".s/sensor",
                                 POUCH_CONTENT_TYPE_JSON,
                                 sbuf,
                                 strlen(sbuf),
                                 K_FOREVER);

        golioth_sync_to_cloud();
    }

    if (POUCH_EVENT_SESSION_END == event)
    {
        service_data.data.flags = 0x00;
        k_work_schedule(&sync_request_work, K_SECONDS(CONFIG_EXAMPLE_SYNC_PERIOD_S));
    }
}

And we immediately notice actual sensor data streaming in instead of the hardcoded value of 22:

Golioth console showing a simulated temperature of 22 followed by an actual reading of 29.5275Bluetooth to Cloud has never been this easy

The Golioth Bluetooth-to-Cloud service is incredibly easy to integrate with your low-power devices. Add a Gateway to your fleet and you will be streaming your sensor data to the cloud right away.

Mike Szczys
Mike Szczys
Mike is a Firmware Engineer at Golioth. His deep love of microcontrollers began in the early 2000s, growing from the desire to make more of the BEAM robotics he was building. During his 12 years at Hackaday (eight of them as Editor in Chief), he had a front-row seat for the growth of the industry, and was active in developing a number of custom electronic conference badges. When he's not reading data sheets he's busy as an orchestra musician in Madison, Wisconsin.

Post Comments

No comments yet! Start the discussion at forum.golioth.io

More from this author

Related posts

spot_img

Latest posts

Expanding Golioth Location with Gateway-Based Positioning

Less than two weeks after Golioth Location general availability, we have expanded the service to support gateway-based positioning, making it possible to obtain the location of devices that do not have GNSS, cellular, or Wi-Fi capabilities.

How to use Zephyr zbus to Communicate Between Threads

If you're not using zbus, you probably should be. As the name indicates, this is the Zephyr bus, a built-in system for publishing, reading,...

Bluetooth Gateways In The Field: The Ezurio Sentrius MG100

As more deployments using Golioth's Bluetooth-to-Cloud hit the field, we will be featuring Bluetooth gateways that are up to the task. Today we're featuring the Ezurio Sentrius MG100, which is well targeted at industrial cellular needs.

Want to stay up to date with the latest news?

Subscribe to our newsletter and get updates every 2 weeks. Follow the latest blogs and industry trends.