カスタムスマートホームデバイス

スマートホームコントロールのカスタマイズ

キットにどのようなスマートホームの制御機能が含まれているかを理解したところで、次は、それらの機能を修正して、単にシリアルモニターに印刷するというよりもむしろ、デバイス自体の属性を制御します。このワークショップでは、PowerController を介して側面の緑色の LED ライトを点灯させる簡単な実装を作成し、Range Controller を使って設定速度でデバイスが点滅するように設定します。

スマートホームデバイスの属性のカスタマイズ

IDE を使用して、cloneを作成した Core2-for-AWS-IoT-EduKit フォルダを開き、Alexa_for_IoT-Intro/components/app_smart_home/app_smart_home.c を開いて、スマートホームデバイスの属性が定義されていることを確認します。109 行の app_smart_home_init() 関数までスクロールダウンすると、以下のコードブロックが表示されます:

/* Add device */
smart_home_device_t *device = smart_home_device_create("Light", alexa_smart_home_get_device_type_str(LIGHT), NULL);
smart_home_device_add_cb(device, write_cb, NULL);
smart_home_node_add_device(node, device);

上記のブロックはデバイスの「フレンドリ名」、つまりデバイスの名前を定義します。LightGreen Light に変更することで、名前がより明確になります。2 行目は以下のようになります。

smart_home_device_t *device = smart_home_device_create("Green Light", alexa_smart_home_get_device_type_str(LIGHT), NULL);

次に、Range Controller の定義を変更して、BrightnessBlink に変更します。もう少し下の141 行までスクロールダウンすると、デバイスのさまざまな属性が定義されているのが確認できます。

/* Add device parameters */
smart_home_param_t *power_param = smart_home_param_create("Power", SMART_HOME_PARAM_POWER, smart_home_bool(true), SMART_HOME_PROP_FLAG_READ | SMART_HOME_PROP_FLAG_WRITE | SMART_HOME_PROP_FLAG_PERSIST);
smart_home_device_add_param(device, power_param);

smart_home_param_t *brightness_param = smart_home_param_create("Brightness", SMART_HOME_PARAM_RANGE, smart_home_int(100), SMART_HOME_PROP_FLAG_READ | SMART_HOME_PROP_FLAG_WRITE | SMART_HOME_PROP_FLAG_PERSIST);
smart_home_param_add_bounds(brightness_param, smart_home_int(0), smart_home_int(100), smart_home_int(1));
smart_home_device_add_param(device, brightness_param);

点滅回数の最大値を100から10に更新する必要があります。そこで、brightness_param 変数の定義と smart_home_param_add_bounds 関数の呼び出しに変更を加えると、以下のように表示されます。

smart_home_param_t *brightness_param = smart_home_param_create("Blink", SMART_HOME_PARAM_RANGE, smart_home_int(10), SMART_HOME_PROP_FLAG_READ | SMART_HOME_PROP_FLAG_WRITE | SMART_HOME_PROP_FLAG_PERSIST);
smart_home_param_add_bounds(brightness_param, smart_home_int(0), smart_home_int(10), smart_home_int(1));

スマートホームデバイスロジックの追加

ここまででプロパティを変更しましたが、緑色の LED を制御するロジックを実装する必要があります。まず、ライトを制御するためのライブラリを組み込んで、いくつかのグローバル変数も定義する必要があります:

#include "core2forAWS.h"
#define BLINK_DELAY 500
static bool green_light_status = 0;

次に、パワーコントローラーの実装を変更して、緑色の LED を点滅・消灯させます。 write_cb 関数 (元のファイルの 89 行目) Aと次のコードスニペットを探します。

if (val.type == SMART_HOME_VAL_TYPE_BOOLEAN) {
    printf("%s: *************** %s's %s turned %s ***************\n", TAG, device_name, param_name, val.val.b ? "ON" : "OFF");

}

受信した値に基づいたトグルロジックを追加するには、if ステートメントが次のようになるように、3 行のコードを追加します

if (val.type == SMART_HOME_VAL_TYPE_BOOLEAN) {
    printf("%s: *************** %s's %s turned %s ***************\n", TAG, device_name, param_name, val.val.b ? "ON" : "OFF");
    
    //Set the global green_light_status variable to the desired value and set the GPIO1 value the right setting (on/off)
    green_light_status = val.val.b ? 0 : 1;
    Core2ForAWS_LED_Enable(green_light_status);

}

顧客がデバイスをオンにしたいかオフにしたいかを示す電源コントローラーの更新値 (1 または 0) を取得し、側面の緑色のライトをオンまたはオフにします。

次に、「点滅」機能を実装します。まず、設定された回数だけ緑色のライトを点滅させるメソッドを作成する必要があります。次の関数を同じ app_smart_home.c ファイルの void app_device_driver_init() 関数の前に追加します。

static void startLightBlink(int count)
{    
    // Toggle the LED to the opposite of the LED state and get back to the original LED state at the end
    for(int i = (1 + green_light_status); i <= (count * 2 + green_light_status); i++) {
        Core2ForAWS_LED_Enable( i % 2 );
        vTaskDelay(pdMS_TO_TICKS(BLINK_DELAY));
    }
}

この関数を呼び出す RangeController ロジックを更新しします。この場合、write_cb の次のコードブロックにあります。

else if (val.type == SMART_HOME_VAL_TYPE_INTEGER) {
    printf("%s: *************** %s's %s changed to %d ***************\n", TAG, device_name, param_name, val.val.i);

}

新しく作成した startLinkBlink 関数の呼び出しを追加するだけです。ここに以下のように行を追加します。

else if (val.type == SMART_HOME_VAL_TYPE_INTEGER) {
    printf("%s: *************** %s's %s changed to %d ***************\n", TAG, device_name, param_name, val.val.i);

    //call the Trigger Light Blink based on the desired number of actions
    startLightBlink(val.val.i);        

}

アップデートされた Alexa ファームウェアのフラッシュとテスト

必要なデバイス属性と制御ロジックを持つようにプロジェクトが変更され、オンボードの緑の LED が指定の速度で点滅します。ファームウェアを構築し、リファレンスハードウェアにフラッシュし、機能をテストします。デバイスを接続し、PlatformIO CLI ターミナルウィンドウ を開いて選択し、以下のコマンドを貼り付けます。

pio run --environment core2foraws --target upload --target monitor
CTRL** + C キーを押すと、シリアルモニターから抜けます。コマンド pio run --environment core2foraws --target monitor を入力すると、シリアルモニターを再起動することができます。

すべてがうまくいくと、Green Light という名前の新しいデバイスが追加されたことを示す更新情報が Alexa アプリに表示されます。電源を制御してみましょう。

&ldquo;Green Light&rdquo; device added notification

Device named &ldquo;Green Light&rdquo; listed in your Alexa App

  • 音声: Alexa, turn on/off green light light - 側面の緑色の LED ライトがオフまたはオンになります
  • Alexa アプリ経由の場合 - Alexa モバイル (Espressif アプリではありません) を開き、[デバイス] に進み、次に [Lights] または [All Devices] のどちらかに進むと、[Green Light] というデバイスが表示されます (下のスクリーンショットを参照してください)。電源アイコンをタップすると、アイコンのオフとオンが切り替わることがわかります。

Power Controller implemented with the green light

点滅機能をテストすることもできます。

音声: Alexa, set blink to 7 に設定して - 側面の緑色の LED ライトが 7 回点滅します Alexa アプリ経由 - Alexa アプリの Green Light デバイス (ESP Alexa スマートフォンアプリではありません) から、1~10 の間でスライダーを調整すると、指定した回数だけデバイスが点滅します。

Blinking the green LED with power controller slider

おめでとうございます。このチュートリアルが完了しました。 まとめ をご覧ください。


Questions? Please use M5Stack Forum

AWS IoT Kit now features direct access to M5Stack Forum , which is a community-driven, questions-and-answers service. Search re:Post using the Core2 for AWS tag to see if your question has been asked and answered. If not, ask a new question using the Core2 for AWS tag.