コラボフローと色んなデバイスやサービスを使って、クリスマスイヴを盛り上げてみた
毎年、何かしら変なことをしないと気が済まない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テープを巻き付けるためのクリスマスツリーがなかったので、とりあえず私の体に巻き付けてみました。
結果はどうでしょう・・・?
自分で言うのも変な話ですが、カオスすぎますね…。
(もっと体に巻き付けていたはずなのですが、移動している間に解けていたっぽいです)
最後に
他にも組み合わせてみたいサービスや、デバイスがあるので、
来年はそれらを紹介できていきます🎉
一応、ちゃんとしたアドベントカレンダーの記事も書いているので、
良かったら読んでみてください!
 
                     
                    