• ホーム
  • 開発者ブログ
  • コラボフローと色んなデバイスやサービスを使って、クリスマスイヴを盛り上げてみた

開発者ブログ

コラボフローと色んなデバイスやサービスを使って、クリスマスイヴを盛り上げてみた

毎年、何かしら変なことをしないと気が済まないmikoです。

この記事はコラボフロー Advent Calendar 2023 の25日目の記事です。

今年はちゃんと技術を使ってあれこれしようと思い、
家にあったものを組み合わせてくだらないことをしてみました!

やりたいこと

  • ボタンを押したら、コラボフローの申請書を承認する。
  • 申請書が決裁されたら、自宅にあるライトを点灯させる。

実装してみたこと

  1. 自宅にあるボタンを押す。
  2. コラボフロー REST APIを実行し、コラボフローで申請書を承認する。
  3. コラボフローのWebhookをAPI Gatewayで受け取る。
  4. LambdaでSwitchBot APIを実行する。
  5. 自宅のSwitchBotでライトを点灯させる。

デバイスの準備

以下のデバイスを準備しました。

  • ボタンになりそうなもの
  • SwitchBot プラグ
  • Tapo L920-5(LEDテープ)

ボタンになりそうなもの

家に転がっていたキースイッチを使うことにしました。

違和感を感じた方は、良い目をしていますね…。

左が通常のキースイッチ、右がめっちゃでかいキースイッチです。

キースイッチ単品だと使いづらいので、海外から取り寄せた土台やら基板と組み合わせます。

これを、こうして、こうじゃ

これで良い感じのボタンが準備できました!

LEDテープ

次はLEDテープです!5mもあるLEDテープが使われていないまま放置されていました…。

プログラムのあれこれ

次はプログラムを書きました。

  1. ボタンを押し、コラボフロー REST APIを実行する
  2. 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テープを巻き付けるためのクリスマスツリーがなかったので、とりあえず私の体に巻き付けてみました。

結果はどうでしょう・・・?

自分で言うのも変な話ですが、カオスすぎますね…。

(もっと体に巻き付けていたはずなのですが、移動している間に解けていたっぽいです)

最後に

他にも組み合わせてみたいサービスや、デバイスがあるので、
来年はそれらを紹介できていきます🎉

一応、ちゃんとしたアドベントカレンダーの記事も書いているので、
良かったら読んでみてください!

https://zenn.dev/collabostyle/articles/8166ed6faba481

まずは無料で
体験
してみませんか?

30日間の無料お試し
30日間の無料お試し

とりあえず自分で試してみたい方は、
無料お試しをお申し込みください

オンラインデモ
オンラインデモ

操作手順や設定の流れを、
30分程度のお時間で簡単にご説明致します

お試しハンズオン
お試しハンズオン

コラボフローを実際に体験していただける
オンラインセミナーを開催しています