IoT Plug And Play device samples

These samples demonstrate how a device that follows the IoT Plug and Play conventions interacts with IoT Hub or IoT Central, to:

  • Send telemetry.
  • Update read-only and read-write properties.
  • Respond to command invocation.

The samples demonstrate two scenarios:

  • An IoT Plug and Play device that implements the Thermostat model. This model has a single interface that defines telemetry, read-only and read-write properties, and commands.
  • An IoT Plug and Play device that implements the Temperature controller model. This model uses multiple components:
    • The top-level interface defines telemetry, read-only property and commands.
    • The model includes two Thermostat components, and a device information component.

Quickstarts and tutorials

To learn more about how to configure and run the Thermostat device sample with IoT Hub, see Quickstart: Connect a sample IoT Plug and Play device application running on Linux or Windows to IoT Hub.

To learn more about how to configure and run the Temperature Controller device sample with:

Configuring the samples

Both samples use environment variables to retrieve configuration.

  • If you are using a connection string to authenticate:

    • set IOTHUB_DEVICE_SECURITY_TYPE="connectionString"
    • set IOTHUB_DEVICE_CONNECTION_STRING="<connection string of your device>"
  • If you are using a DPS enrollment group to authenticate:

    • set IOTHUB_DEVICE_DPS_ID_SCOPE="<ID Scope of DPS instance>"
    • set IOTHUB_DEVICE_DPS_DEVICE_ID="<Device's ID>"
    • set IOTHUB_DEVICE_DPS_DEVICE_KEY="<Device's security key >"
    • OPTIONAL, if you do not wish to use the default endpoint ""
      • set IOTHUB_DEVICE_DPS_ENDPOINT="<DPS endpoint>"


  • Azure IoT Plug and Play is only supported for MQTT and MQTT over WebSockets for the Azure IoT Node Device SDK. Modifying these samples to use AMQP, AMQP over WebSockets, or HTTP protocols will not work.

  • When the thermostat receives a desired temperature, it has no actual affect on the current temperature.

  • The command getMaxMinReport allows the application to specify statistics of the temperature since a given date. To keep the sample simple, we ignore this field and instead return statistics from the entire lifecycle of the executable.

  • The temperature controller implements a command named reboot which takes a request payload indicating the delay in seconds. The sample will ignore this command.