Azure IoT Hub デバイス ツインで室内仮想サーモスタットを設定する方法

完了

このユニットでは、Azure Sphere に接続された暖房、換気、および空調装置 (HVAC) を Azure IoT Hub から制御する方法について学習します。

IoT Hub デバイス ツインの概要

特定の時点の値を表すために、Azure IoT Hub ではデバイス ツインが使用されます。 IoT Hub では、デジタル ツインを使用してデバイスの状態を設定できます。たとえば、目的の室温を設定できます。 また、デバイスでも、デジタル ツインを使用してその現在の状態を報告することができます。たとえば、HVAC (暖房、換気、空調) 装置の動作モード (現在、暖房か、冷却か、それともオフ状態か) を報告することができます。

デバイス ツインとは、Azure IoT Hub によってクラウド内に保持されるすべてのデバイスに関する JSON ドキュメントであり、メタデータ、構成、条件などのデバイス情報を格納するために使用されます。 IoT Hub デバイス ツインは、デバイスを特定の状態にすること、およびデバイスの再起動後にその状態に戻すことを目的とした実行時間の長いコマンドによく使用されます。 例として、目標温度の設定が挙げられます。

プロパティは次の方法で使用できます。

  • クラウドからデバイスへの更新
  • デバイスからクラウドへの更新
  • reported プロパティのクエリ

Azure IoT Hub デジタル ツインを使用した暖房、換気、空調装置 (HVAC) の制御

Azure IoT Explorer から、目標温度のツインを設定できます。 デバイスによって、アクションの実行および要求に対する受信確認が行われます。 デバイス ツインの reported プロパティおよび IoT Explorer の更新、さらに、この reported プロパティのクエリおよび表示が Azure IoT Hub によって行われます。

The illustration shows a cloud to device device twin configuration pattern.

IoT Explorer から HVAC 装置を制御する手順

以下の手順では、Azure IoT Explorer でデバイス ツインを使用してデバイスにプロパティを設定する方法の概要を示します。

  1. Azure IoT Explorer から目標温度を設定できます。
  2. Azure IoT Hub によって、デバイス ツインの desired プロパティが更新され、デバイス ツイン メッセージがデバイスに送信されます。
  3. 対応するデバイス ツイン ハンドラー関数が呼び出されます。
  4. デバイスにより、目標のプロパティが実装されます。この場合は、ヒーターまたはクーラーをオンにして、部屋を目標の温度にします。
  5. 更新された構成の受信確認がデバイスから Azure IoT Hub に送られます。 Azure IoT Hub によって、デバイス ツインの reported プロパティが更新されます。
  6. IoT Explorer によりデバイス ツインの reported プロパティ データが照会され、表示されます。

デバイス ツインのバインドの概要

デバイス ツインのバインドにより、デバイス ツインのプロパティ名を、アクションを実装するために呼び出されるハンドラー関数にマップできます。

次の例では、目標の室温を設定するためのデバイス ツインのバインドを宣言します。 この宣言により、Azure IoT Hub デバイス ツインの DesiredTemperatureDeviceTwinSetTemperatureHandler という名前のハンドラー関数がマップされます。

static LP_DEVICE_TWIN_BINDING dt_desiredTemperature = {
    .twinProperty = "DesiredTemperature",
    .twinType = LP_TYPE_FLOAT,
    .handler = DeviceTwinSetTemperatureHandler };

目標温度の設定

ハンドラー関数 DeviceTwinSetTemperatureHandler の実装を次に示します。 ハンドラー関数は、デバイスが Azure IoT Hub から DesiredTemperature 目標プロパティ メッセージを受信すると呼び出されます。

Note

IoT プラグ アンド プレイ規則の一部として、デバイスには、lp_deviceTwinAckDesiredState を呼び出すことでデバイス ツインの更新の受信確認を行うことが求められます。

/// <summary>
/// Device Twin Handler to set the desired temperature value
/// </summary>
static void DeviceTwinSetTemperatureHandler(LP_DEVICE_TWIN_BINDING* deviceTwinBinding)
{
    // validate data is sensible range before applying
    if (deviceTwinBinding->twinType == LP_TYPE_FLOAT && *(float*)deviceTwinBinding->twinState >= -20.0f && *(float*)deviceTwinBinding->twinState <= 80.0f)
    {
        lp_deviceTwinAckDesiredState(deviceTwinBinding, deviceTwinBinding->twinState, LP_DEVICE_TWIN_COMPLETED);
        SetHvacStatusColour((int)previous_temperature);
    }
    else {
        lp_deviceTwinAckDesiredState(deviceTwinBinding, deviceTwinBinding->twinState, LP_DEVICE_TWIN_ERROR);
    }
}

現在の HVAC 動作モードのレポート

HVAC 動作モードは、室温に応じて、暖房、冷却、オフ状態のいずれかになります。 デバイスからクラウドへの、デバイス ツインの更新を使用すれば、HVAC 装置の現在の動作モードを報告できます。

デバイスからクラウドへの更新

The illustration shows a device to cloud device twin configuration pattern.

  1. HVAC 動作モードが変更されていることが Azure Sphere によって検出されます。
  2. HVAC の新しい動作モードを報告するデバイス ツイン メッセージが、Azure Sphere から Azure IoT Hub に送信されます。
  3. HVAC 装置の更新された動作モードが IoT Explorer によってクエリおよび表示されます。

次の例では、string 型の ReportedHvacState デバイス ツイン プロパティを宣言します。 これはデバイスからクラウドへの一方向のバインドであるため、ハンドラー関数は必要ありません。

static LP_DEVICE_TWIN_BINDING dt_reportedHvacState = {
    .twinProperty = "ReportedHvacState",
    .twinType = LP_TYPE_STRING };

デバイスによって lp_deviceTwinReportState 関数が呼び出されて、ReportedHvacState プロパティが更新されます。 正しい型のプロパティを渡す必要があります。

lp_deviceTwinReportState(&dt_reportedHvacState, (void*)hvacState[(int)current_led]);

デバイス ツイン メッセージをハンドラーにマップする方法

宣言されているすべてのデバイス ツインのバインドを、deviceTwinBindingSet 配列への参照渡しによって追加する必要があります。 デバイス ツイン メッセージがデバイスに届くと、deviceTwinBindingSet 配列内に一致する twinProperty 名がないか確認されます。 一致が見つかった場合は、対応するハンドラー関数が呼び出されます。

LP_DEVICE_TWIN_BINDING* deviceTwinBindingSet[] = { &dt_desiredTemperature, &dt_reportedTemperature, &dt_reportedHvacState };

デバイス ツインのバインド セットを開く

デバイス ツインのバインド セットは、main.c にある InitPeripheralsAndHandlers 関数で初期化されます。

lp_deviceTwinSetOpen(deviceTwinBindingSet, NELEMS(deviceTwinBindingSet));

デバイス ツインのバインド セットを閉じる

デバイス ツインのバインド セットは、main.c にある ClosePeripheralsAndHandlers 関数で閉じられます。

lp_deviceTwinSetClose();