過去にQiitaに投稿した内容のアーカイブです。
Greengrass Coreがv1.9.3でArmv6lをサポートしました。ラズパイZeroでもGreengrassが動作するようになりました。
https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/what-is-gg.html
久しぶりにGreengrassに触るので、Greengrassコネクタを使ってLチカをしてみました。
GreengrassコネクタにRaspberry Pi GPIOコネクタ
が用意されているので簡単です。
ラズパイZeroの準備
以下の公式ドキュメントに従って行います。
Raspberry Pi のセットアップ https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/setup-filter.rpi.html
モジュール 2: AWS IoT Greengrass Core ソフトウェアのインストール https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/module2.html
Greengrassの設定
リソースの追加
Raspberry Pi GPIOコネクタがGPIOにアクセスするため、リソースを設定します。
対象のGreengrassグループを選択し、リソース
タブを表示し、ローカルリソースの追加
ボタンを押します。
設定項目 | 設定値 |
---|---|
リソース名 | 任意の名前 |
リソースタイプ | デバイス |
デバイスパス | /dev/gpiomem |
グループ所有者のファイルアクセス許可 | リソースを所有するLinuxグループのOSグループアクセス許可を自動的に追加 |
Lambda関数の関連 | 無指定でOK |
コネクタの追加
Raspberry Pi GPIOコネクタを追加します。
対象のGreengrassグループを選択し、コネクタ
タブを表示し、コネクタの追加
ボタンを押します。
Raspberry Pi GPIOを選択したあと、パラメータはこんな感じで指定しました。
設定項目 | 設定値 |
---|---|
Resource for /dev/gpiomem device | 作成したリソース |
Input GPIO pins | 2 ※ボタンのGPIOピン番号 |
Input GPIO polling period | 50(millisecond) |
Output GPIO pins | 17 ※LEDのGPIOピン番号 |
Lambdaの作成
ボタンが押された/離された
イベントで起動し、LEDのオン/オフを設定する
処理を行います。試行錯誤したのであまりきれいではありませんが。。
import os
import greengrasssdk
import json
import sys
import logging
## Setup logging to stdout
logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
iot_client = greengrasssdk.client('iot-data')
thingName = os.environ['AWS_IOT_THING_NAME']
def get_read_topic(gpio_num):
return '/'.join(['gpio', thingName, str(gpio_num), 'read'])
def get_write_topic(gpio_num):
return '/'.join(['gpio', thingName, str(gpio_num), 'write'])
def send_message_to_connector(topic, message=''):
iot_client.publish(topic=topic, payload=str(message))
def set_gpio_state(gpio, state):
send_message_to_connector(get_write_topic(gpio), str(state))
def read_gpio_state(gpio):
send_message_to_connector(get_read_topic(gpio))
def function_handler(event, context):
logger.info("Received message!")
logger.info(event)
logger.info(type(event))
# event
# 1 : button off
# 0 : button on
state = 0
if(event == 0):
state = 1
set_gpio_state(17, state)
return
LambdaにはAWS IoT Greengrass Core SDK for Python
を含める必要があります。このあたりを参考にしました。
Lambda 関数の作成とパッケージ化 https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/create-lambda.html
Lambdaの追加
作成したLambdaをGreengrassに追加します。
対象のGreengrassグループを選択し、Lambda
タブを表示し、Lambdaの追加
ボタンを押します。
設定項目 | 設定値 |
---|---|
Lambdaの追加 | 既存の Lambda 関数の使用 |
Lambda の選択 | 作成したLambda |
Lambda バージョンの選択 | 作成したLambdaのバージョン |
サブスクリプションの追加
対象のGreengrassグループを選択し、サブスクリプション
タブを表示し、サブスクリプションの追加
ボタンを押します。
ボタンイベント -> Greengrassコネクタ -> Lambda呼び出し
ソース | ターゲット | トピック |
---|---|---|
Raspberry Pi GPIO | Lambda | gpio/+/ボタンのGPIOピン番号/state |
Lambda -> Greengrassコネクタ -> LEDオンオフ
ソース | ターゲット | トピック |
---|---|---|
Lambda | Raspberry Pi GPIO | gpio/+/LEDのGPIOピン番号/write |
サブスクリプションをいじれば、クラウド経由でLチカも簡単です。
デプロイ
これで設定は完了です。デプロイしましょう。