コラボフローと色んなデバイスやサービスを使って、クリスマスイヴを盛り上げてみた
毎年、何かしら変なことをしないと気が済まないmikoです。
この記事はコラボフロー Advent Calendar 2023 の25日目の記事です。
今年はちゃんと技術を使ってあれこれしようと思い、
家にあったものを組み合わせてくだらないことをしてみました!
やりたいこと
- ボタンを押したら、コラボフローの申請書を承認する。
- 申請書が決裁されたら、自宅にあるライトを点灯させる。
実装してみたこと
- 自宅にあるボタンを押す。
- コラボフロー REST APIを実行し、コラボフローで申請書を承認する。
- コラボフローのWebhookをAPI Gatewayで受け取る。
- LambdaでSwitchBot APIを実行する。
- 自宅のSwitchBotでライトを点灯させる。
デバイスの準備
以下のデバイスを準備しました。
- ボタンになりそうなもの
- SwitchBot プラグ
- Tapo L920-5(LEDテープ)
ボタンになりそうなもの
家に転がっていたキースイッチを使うことにしました。
違和感を感じた方は、良い目をしていますね…。
キースイッチ単品だと使いづらいので、海外から取り寄せた土台やら基板と組み合わせます。
これを、こうして、こうじゃ
これで良い感じのボタンが準備できました!
LEDテープ
次はLEDテープです!5mもあるLEDテープが使われていないまま放置されていました…。
プログラムのあれこれ
次はプログラムを書きました。
- ボタンを押し、コラボフロー REST APIを実行する
- LambdaでSwitchBot APIを実行する
1. ボタンを押し、コラボフロー REST APIを実行する
でかいキーキャップをキーボード化する
特定のキーが入力されたら、ノートPCからコラボフロー REST APIを実行するようなプログラムをPythonで書きます。
まずは、ボタンを押したら、キー入力の信号を送るようにします。
今回は、Pro Microを使って、でかいキースイッチを1キーのみのキーボードとして認識させ、
キー入力を検出するようにします。
(Pro Microは、自作キーボード界隈でよく使われているマイコンボードです。)
QMK Firmwareを利用し、ボタンが押された際に、F13キーの信号を送るようにします。
(通常のキーボードにはF13キーは存在していないので、F13キーを利用していますが、他のキーでも問題ありません)
キーマップを設定するコードは以下の通りです。
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_F13
),
};
コラボフロー REST APIを実行するコード
次は、Pythonのプログラムを作成していきます。
F13キーが押されたら、コラボフロー REST APIを実行するようにしています。
import requests
def updateDocument():
endpointUrl = "http://{ホスト名}/{インスタンス名}/api/index.cfm/v1/documents/{document_id}?app_cd={app_cd}"
headers = {
"X-Collaboflow-Authorization": "{APIキー}",
"Content-Type": "application/json"
}
# コマンドデータ
bodyData = {
"action": "accept",
"comment": "Merry Christmas!",
"document": {}
}
# API リクエストを実行
response = requests.put(endpointUrl, headers=headers, json=bodyData)
# レスポンスを表示
print(response.text)
def on_press(key):
try:
if key == keyboard.Key.f13: # F13キーの検出
print("F13 pressed, calling API...")
updateDocument()
except Exception as e:
print("Error:", e)
# キーボードリスナーの開始
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
でかいキースイッチをPCと接続し、このプログラムを実行させます。
そしてキー入力後に、APIが実行されて、対象の申請書が承認されていればOKです。
2. LambdaでSwitchBot APIを実行する
サクッとCDKを使って、API GatewayとLambdaを作成します。
いつもは、TypeScriptで書いていますが、今回はPythonで書いてみました。
まずは、cdkアプリの作成とライブラリをインストールします。
cdk init app --language python
python -m pip install aws-cdk-lib constructs
app.py
を編集します。
from aws_cdk import (
App, Stack, aws_lambda as lambda_, aws_apigateway as apigateway
)
from constructs import Construct
class SwitchBotStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# Lambda 関数の作成
lambda_function = lambda_.Function(
self, 'SwitchBotHandler',
runtime=lambda_.Runtime.PYTHON_3_12,
code=lambda_.Code.from_asset('lambda'),
handler='switchbot_handler.lambda_handler'
)
# API Gateway の作成
api = apigateway.LambdaRestApi(
self, 'SwitchBotEndpoint',
handler=lambda_function
)
# API Gateway のリソースとメソッドの設定
items = api.root.add_resource('turnonlight')
items.add_method('POST')
app = App()
SwitchBotStack(app, "SwitchBotStack")
app.synth()
次にフォルダ「lambda」を作成し、ファイル「switchbot_handler.py」を作成します。
SwitchBotのAPIについては、以下のページを参考にしました。
https://github.com/OpenWonderLabs/SwitchBotAPI
import requests
def lambda_handler(event, context):
# あなたの SwitchBot API キー
api_key = "{api key}"
# SwitchBot API エンドポイント
url = "https://api.switch-bot.com/v1.0/devices/デバイスID/commands"
# ヘッダーに API キーを設定
headers = {
"Authorization": api_key,
"Content-Type": "application/json"
}
# コマンドデータ
command = {
"command": "turnOn",
"parameter": "default",
"commandType": "command"
}
# API リクエストを実行
response = requests.post(url, headers=headers, json=command)
# レスポンスを表示
print(response.text)
return response.text
あとは、デプロイするだけです。
cdk synth
cdk deploy
デプロイに成功したら、Lambdaでのテストか、APIのエンドポイントへアクセスして、
自宅にあるSwitchBot プラグに反応があればOKです!
実際に試してみた
最後に、動作確認を行います。
でかいキースイッチを押した後、しばらくしてLEDが光れば成功です。
LEDテープを巻き付けるためのクリスマスツリーがなかったので、とりあえず私の体に巻き付けてみました。
結果はどうでしょう・・・?
自分で言うのも変な話ですが、カオスすぎますね…。
(もっと体に巻き付けていたはずなのですが、移動している間に解けていたっぽいです)
最後に
他にも組み合わせてみたいサービスや、デバイスがあるので、
来年はそれらを紹介できていきます🎉
一応、ちゃんとしたアドベントカレンダーの記事も書いているので、
良かったら読んでみてください!