Help us understand the problem. What is going on with this article?

IoTボタンを安く手に入れてノーコードでWeb APIを叩く方法

概要

ダイソーのBluetoothボタンを改造して、スマホ経由でWeb APIを叩く方法を試してみた。ボタンを押したら時間の計測を開始して別のボタン押したら時間の計測を停止するのを作った。スマホにストラップにつけた。MacroDroidってアプリとIntegromatってサービスを使ってTogglで時間トラッキングしてる。結果、動いた。スクリーンオフのときの挙動に不満は残る。

image.png

はじめに

家事とか育児してて、物理的なスイッチを使って時間管理したいと思った。仕事だと、目の前にPCがあるので、それなりに時間管理できるけど、家事とか育児してるといつの間にか時間たつ。スマホでやってもいいのかもやけど、スマホ出すとツイッターとか立ち上げちゃうので、微妙。家事やと手が濡れてたり、子どもいるとスマホとられたりするし。余計時間なくなる。ペンとノート使ってアナログでやってもいいけど、それなりにめんどい。記憶するのは無理。

以前MESHとtogglってサービス使って試しに作ったことあるけど、通信があんまり安定してなくて使わなくなった。MESHは、子どもが食べたりボタン押しまくったりするし。
MESH動きタグとtogglで時間管理 - Qiita

他のIoTボタンも、それなりに値段が高いので買う気にならなかった。

ESP32とかで作ってもいいけど、基板むき出しやと子供いてあぶないし(食べるorなめる)、ケース作るのめんどい。バッテリーも悩ましい。

そんなことを思いながら、先日、ダイソー(100均)で別のもの探してたら、330円でBluetoothリモートシャッターなるものを見つけた。それで何か作れないか試すことにした。

image.png

仕様

仕様考えてみた。

  • ボタン押したら、時間測り始める。
  • もう一つのボタン押したら、時間測るの止める。 (ボタン一つでON/OFFしてもいいけど、状態がわからないので、ボタン二つ使うことにした。)
  • インターネットにつないでToggl(タイムトラッキングサービス)とかグーグルカレンダーにログを残す。
  • できたら、複数のボタンにそれぞれ仕事内容(育児とか家事とか趣味とか)を割り当てる。

調査

2年くらい前に流行ってたらしい。そういえば見たことあったかも。いろんな記事を発見。どう実装するのが良いか調査した。

Bluetoothリモートシャッター(ダイソー)

もとの仕様

Bluetoothでペアリングして、離れたところからカメラアプリのシャッターを切るためのもの。
ボタン2つあって、iOS用とAndroid用のボタン。ボタン自体はボリュームアップに対応してるらしい。Androidの方は、ボリュームアップに加えてエンターキー?の信号を送ってるらしい。なぜか。Android用のボタンが使いにくい。

回路

ボリュームダウンのピンを見つけてる。すごい。同じように改造したら、動いた。
これで、Android用のボタンも自然に使える。

ダイソーでスマホ用Bluetoothリモートシャッターを発見→分解→ちょい改造:ウェブ情報実験室 - Engadget 日本版

ラズパイ(bluebutton)

ラズパイとつないで遊ぶには、Rubyで書かれてるbluebuttonっての使う方法が手っ取り早そう。試してみたら、すんなり動いた。

わずか300円でIoTボタンを作る方法 - Qiita
Bluetoothシャットダウンボタンを作る #300円でIoTボタン - Qiita
raspberry pi と AB Shutter3(bluetoothボタン) の連携 - フクロウ好きなエンジニアのブログ

ラズパイ(evdev)

evdevって、HIDデバイスの入力を使うライブラリ使ってる。こっちだと複数のボタンに対応しやすそう。こっちも試してみたらすんなり動いた。

100均Bluetoothボタンをラズパイに活用

ESP32

他にも、ESP32につないで、ゲートウェイとして(?)使う人もいるっぽい。結構、難易度高そう。こっちは試す元気なかった。今回の場合、ESP32を使うなら、はじめからESP32で作ったらいい気がする。

M5StickC(ESP32)でダイソーのBluetoothシャッターを操作 – Lang-ship
ダイソー BLE リモートシャッター で SwitchBot を操る - ブログ/こばさんの wakwak 山歩き

BLE

BLEのPythonライブラリbluepy使ってBLEとして認識させて動かしてみたかったけど、HID over GATTを自分でなんとかするのは難易度高そうやった。適当なUUIDにWriteしてNotificationを待ってたらいいのかなと思ったけど、できなかった。残念。

bluepy - a Bluetooth LE interface for Python — bluepy 0.9.11 documentation

Android連携

ラズパイでやってもよかったんやけど、屋外でも使いたいし、スマホで楽にできないかなと調べてみた。ラズパイやとなぜかペアリングが安定しなかった。解決難しそうやった。ただ、アプリ作るほどのモチベーションもなかったので、IFTTT的なサービスを探した。

IFTTT

「Bluetoothデバイスが接続したら」ってトリガーはあるけど、特定のデバイスは無理そうやった。残念。
Recipe for connecting to specific Bluetooth device? : ifttt

Tasker

やりたいことできそうやったけど、適当にさわってもうまく使えなかったのであきらめた。
使い方調べるほどの気力がなかった。残念。
Tasker for Android

MacroDroid

Androidの自動化をいろいろできそうなアプリ。特定のBluetoothがつながった場合に、〇〇するって動作を実現できる。ボリュームボタンもトリガーにできる。Triggers、Actions、Constraintsってのがあって、IFTTTよりも柔軟。Constraintsがある分、玄人向けなんかも。サービス連携はあまりなさそう。ツイッターくらい。有料やともっとあるんかな。詳しくは調査してない。これ使うことにした。
MacroDroid - デバイス自動化 - Google Play のアプリ

Toggl連携

Zapier

IFTTT的なサービス。Toggl連携あり。ただ、無料枠の制限がきつい。
Zapier | The easiest way to automate your work

Integromat

Zapierとほぼ同じサービス。Toggl連携あり。無料枠(今のところ)大きめ。これも使うことにした。
Integromat - The glue of the internet

構成

こんな感じで接続。
image.png

MacroDroidから、HTTP POSTできなかったので、Toggl APIを直接叩けなかった。
Togglと連携できるのは、調べた感じZapierとIntegromat。IFTTTはできない。
GASとか使ってやる方法もあるやろけど、既存のサービス使ってノーコードでやった。
MacroDroidからIntegromatにはHTTP GET使った。メールとかを経由してやってもできそうやったけど、HTTP GETの方が簡単そうやったので、HTTP GETした。

設定

Bluetoothリモートシャッター(ダイソー)

下記サイトを参考に回路を修正。
ダイソーでスマホ用Bluetoothリモートシャッターを発見→分解→ちょい改造:ウェブ情報実験室 - Engadget 日本版

image.png

MacroDroid

Bluetoothボタンが接続したら、スクリーンをオンにする。スクリーンがオフやとボリュームボタンを認識してくれないので、接続時にオンになるようにした。
image.png

Bluetoothボタンが接続されているときに、ボリュームボタンが押されたらIntegromatにHTTP GETする。
image.png

image.png

image.png

Integromat

WebhooksにTogglつないだら動く。設定はすごくシンプルなので省略。HELP結構充実してるのでそんなに迷わずできた。

Togglのエントリーをスタート

ほぼ、つなぐだけ。
image.png

Togglのエントリーをストップ

ストップするときは、カレントエントリーの情報を取得してストップする。
image.png

デフォルトの設定だとエントリーがスタートしてないときストップすると、カレントエントリーがなくてエラーで止まる。なので、エラー無視する。もうちょい、スマートに通知できるといいんやろうけど。
image.png

その他API

HTTP POSTはこんな感じでできる。
image.png

認証のためのブロックもいくつか用意されてる。
image.png

Toggl

"Profile Settings"ってところに、API Key書かれてる。
image.png

動作手順

こんな感じ。スタートもストップも再接続に5秒くらいかかる。微妙やけど、改善できなそう。

スタート時

  1. いずれかのボタンを押してBluetooth接続→スクリーンオンになることを確認
  2. ボタン1を押してTogglスタート

ストップ時

  1. いずれかのボタンを押してBluetooth接続→スクリーンオンになることを確認
  2. ボタン2を押してTogglストップ

制約

接続が切れていないとき(ボタン押して30秒くらい?)は、スクリーンを自分でオンにしてボタンを押さないと動作しない。微妙やけど、そんなに早く作業を止めない前提。

おわりに

とりあえず、動いてよかった。他にも応用できそう。改善の余地は大いにあるけど、僕のスキル的に、これ以上は難しそう。

スマホスクリーンオフだと反応しないのは残念。まあ、接続時にオンになるようにできたので、よしとした。

あと、ダイソーのボタンはしばらくするとスリープモードに入る。ボタンを押すとBluetooth接続しなおす。5秒くらいはかかる。それも微妙。再接続後に勝手に信号送信してくれたらいいけど、やってくれない。ボタン内のマイコンのプログラム書き換えれないっぽいので無理そう。ペアリング先は覚えてくれてるけども。すでに売られている製品はそこらへん、うまいことしてんのかな。

補足

終盤に、致命的なことに気付いた。スマホスクリーンがオフのとき、反応しない。もっと早く確認すべきやった。検証項目漏れ。HUAWEI P20liteやからかも。残念。Bluetoothの接続はするけど、そのあとトリガーがかからない。なので、接続時にスクリーンオンになるようにした。ちょっと微妙。Androidの設定をいくつか確認したけど、断念。

いちおう、こんなんは見つけた。
Volume Button trigger when Screen Off - MacroDroid Forums

ちなみに、スクリーンオフで音楽かけてたら動作した。音楽かかってるときは、ボリュームアップダウンを認識してくれるみたい。でも、ずっと音楽聴くわけにもいかんしなぁ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした