ジェネリックトレネ
振動を検知して荷物の盗難を防ぐデバイス「トレネ」のクラウドファンディングが、目標金額を達成しています。
- モニタリングアラーム「トレネ」でクラウドファンディングを活用 | ニュース 2017年 | ファイルとテプラのキングジム
- 一人での外出をもっと快適に!荷物を見守る小さなパートナー「TRENE(トレネ)」 | クラウドファンディング - Makuake(マクアケ)
要素技術が、振動センサーと Bluetooth ということで、Raspberry Pi Zero W と少しのパーツで似た機能の実現を目指しました。盗られたことがわかるので、「トラレ」と呼ぶことにします。
緑色のミンティア(カテキンミント)の中に収まっているのが Raspberry Pi で、ケーブル接続されている黒い物体は一般的なモバイルバッテリーです。(ミンティアから飛び出している赤外線 LED は今回関係ありません)
まずは振動センサーですが、15 円/個くらいの 水銀スイッチ - Wikipedia を Raspberry Pi の GPIO18 ピンと GND にはんだ付けしました。水銀スイッチは取り扱いを誤ると、環境に悪影響を及ぼすため 金属球で感知するタイプ もあります。GPIO18 がオフからオン、または逆に変化したとき、傾きが発生したとみなすことができます。
「トラレ」と iOS 端末の距離は、Raspberry Pi が Bluetooth の RSSI 値を定期的に取得することで監視します。今回は GitHub - ewenchou/bluetooth-proximity: Bluetooth Proximity Detection using Python を利用しました。
iOS 端末が一定以上離れていて、Raspberry Pi が傾きを検知したとき、iOS 端末に通知をおこないます。本家「トレネ」では、本体が警告音を発する仕様ですが、誤動作で注目を集めるのは望むところではないので、そのようにしました。Bluetooth による通知といえば、一時期ブームだった iBeacon - Wikipedia という仕組みがあるため、それを用います。
これらを組み合わせて「トラレ」として動作させるために Raspberry Pi 上で実行する TRARE · GitHub を作成しました。さらに、iOS 端末で iBeacon を受信するためのアプリのインストールが必要です。iBeacon advertisement を受信できるアプリは数多くありますが、任意の UUID を指定でき、バックグラウンドでも通知可能な 「Find My Stuff - 鍵やお財布から車まで、あなたの所持品を即座に位置確認!」をApp Storeで を採用しました。
Bluetooth が届く距離にいないと通知が受け取れないという懸念はあります。試した限りでは、壁を隔てた隣の部屋くらいであれば問題ないようです。圏外にいたとしても iBeacon advertisement は発信され続けるため、圏内に入った時点で通知されます。
Raspberry Pi Zero W は $10 なので、「トレネ」の予定価格 6,800 円と比較すると、コストパフォーマンスの高さが際立ちます。
Siri に本当の愛を問う
- しくみ
- Raspberry Pi Zero W の GPIO と赤外線 LED を接続
- raspi に Homebridge と LIRC をインストール
- Homebridge にスイッチを登録し iOS 端末と Bluetooth 接続
- スイッチがオンになったら LIRC 経由で赤外線 LED を制御
- カラオケパセラの Σsystem - Wikipedia にリクエストを送信する
- raspi と赤外線 LED の回路図その他は、多くの先人が英知を残しているので割愛
- ミンティアのケースに入れた先達 に学び、赤外線 LED 関連も含めて格納する
- カラオケへの送信は 先駆者 がいるのだが、リモコン信号のフォーマットが不明なので、自力で raspi に赤外線センサーを取り付けて LIRC で学習する
begin remote name SIGMA bits 16 flags SPACE_ENC eps 30 aeps 100 header 9094 4425 one 642 1608 zero 642 481 ptrail 646 pre_data_bits 16 pre_data 0xAA55 gap 39822 toggle_bit_mask 0x0 begin codes 0 0xc837 1 0xf00f 2 0xf20d 3 0x728d 4 0xe01f 5 0xe21d 6 0x629d 7 0xc03f 8 0xc23d 9 0x42bd A 0xca35 B 0x4ab5 E 0x7c83 end codes end remote
-
- 曲番号を 3825A4 とした場合、以下のようにパディングと終端をつけて送信する
$ irsend SEND_ONCE SIGMA 3 8 2 5 A 0 4 E
-
- これを Homebridge のスイッチに登録
{ "accessories": [ { "accessory": "CMD", "name": "ようこそジャパリパークへ", "on_cmd": "/usr/bin/irsend SEND_ONCE SIGMA 3 8 2 5 A 0 4 E", "off_cmd": "true" } ] }
- iOS 端末の HomeKit を設定
- Anker PowerCore 10000 でオートパワーオフせずに 80mA で駆動できる と先人がおっしゃるので購入、動いた
突然ですが、けものフレンズのアニメから外れる事になりました。ざっくりカドカワさん方面よりのお達しみたいです。すみません、僕もとても残念です
— たつき/irodori (@irodori7) 2017年9月25日
- 愛はどこにある…
サーバレスに OpenID Connect で AWS にサインイン
- サーバレスの言葉の意味を理解していませんが、「サーバインスンタンスを使わない」程度に思っておきましょう
- サーバインスタンスを使わずに、Google の OpenID Connect による認証で AWS マネジメントコンソール | AWS へのサインインおよび AWS コマンドラインインターフェイス(CLI - AWS サービスの制御・管理)|AWS の設定ができるツールを構築します
準備
$ git clone https://github.com/asannou/aws-signin-with-oidc
- 適当な S3 バケット名を決め terraform.tfvars に書き込みます
- Google Cloud Platform から、適当なプロジェクトを作り "OAuth クライアント ID" の API 認証情報を作成します
- "OAuth 同意画面" でサービス名の設定が必要な場合がありますが、適当に入力します
- "クライアント ID の作成" でアプリケーションの種類から "ウェブアプリケーション" を選択します
- 適当に名前を決めて作成します
- "クライアント ID" が表示されるので terraform.tfvars に書き込みます
- Dev と Admin という IAM ロールがあるので、それぞれサインインを許可するユーザのメールアドレスを terraform.tfvars に書き込みます
- Dev は ReadOnlyAccess ポリシー、Admin は AdministratorAccess ポリシーがアタッチされます
- ここは適宜 カスタマイズ してください
- 最終的にこのような感じになります
$ git diff diff --git a/terraform.tfvars b/terraform.tfvars index 2d3d635..ec5d990 100644 --- a/terraform.tfvars +++ b/terraform.tfvars @@ -1,17 +1,17 @@ aws_region = "us-east-1" -s3_bucket = "bucketname" +s3_bucket = "aws-signin-with-oidc" client_id = { - google = "000000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com" + google = "689439588880-vmco4me6g34au0h43ao9tbkb3slgffht.apps.googleusercontent.com" } email = { dev = [ - "dev@example.com", + "asannou@gmail.com", ] admin = [ - "admin@example.com", + "asannou@gmail.com", ] }
- terraform を適用します
$ terraform apply ... google = { admin = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Admin dev = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Dev } origin = https://aws-signin-with-oidc.s3.amazonaws.com
- 出力された origin を、先ほどの Google Cloud Platform のウェブアプリケーションを開き "承認済みの JavaScript 生成元" に追加して、準備は完了です
利用
- 出力された https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Dev をブラウザでアクセスすると、OAuth 同意画面を経由して、AWS コンソールに Dev ロールでサインインできるはずです
-
- できない場合は、反映が遅れている可能性があるため、少し待って再度試してください
- AWS CLI を使用する際は、URL の末尾に &export=1 をつけて認証をおこなうと、ブラウザに環境変数が表示されます
$ export AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE; export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY; export AWS_SESSION_TOKEN=AQoDYXdzEJr... $ aws sts get-caller-identity { "Account": "123456789012", "UserId": "AROAIOSFODNN7EXAMPLEU:asannou@gmail.com", "Arn": "arn:aws:sts::123456789012:assumed-role/Dev/asannou@gmail.com" }
雑感
- SAML であれば、ネイティブで AWS コンソールへのサインインが提供されているが…
- そういった事情により OpenID Connect 採用
- Implicit Grant Flow なんて、バックエンドで検証しなきゃいけないし一生使わねえと思ってたけど、まるでサーバレスのために用意されていたかのよう
- G Suite 環境では OAuth の濫用が懸念だったが、昨日解決した
社員がG Suiteと併用してもよいサードパーティアプリケーションをアドミンが管理できるようになる | TechCrunch Japan @asannou https://t.co/u0VDvceeg5
— nov matake (@nov) 2017年8月2日
- フェデレーションユーザーに対して AWS マネジメントコンソール へのアクセスを許可する URL の作成(カスタムフェデレーションブローカー) - AWS Identity and Access Management が CORS に対応していないせいで、API Gateway まで使う羽目になった