プログラミングに覚えのある方なら30分程度の仕事だろうが、あまり馴染みのない自分がタイトル通りのことをやったらとんでもなく時間かかった。ので、備忘録です。
自分の職場は自動車整備工場で、昔ながら朝イチでラジオ体操を流しています。ラジオ体操って意外と体力いるしは良いもんなのですが「ラジオ体操の再生ボタンを押す当番」みたいなものがあり、大変鬱陶しく感じてました。(当番表作ったり、当番が休みの日は他のスタッフでお見合いになったり、忘れていた新入社員を指導したり・・・)どうせ時間通りに流すんだし、自動化できるでしょう、、、ということでやってみました。
音源は古いCDプレーヤー(ONKYO)。これが館内の全体放送のスピーカーに直結してあり、それで再生されています。リモコンはおそらく最初からなかったようです。
自動化その1:SwitchBotハブミニの導入
CDプレーヤーの型番を調べたところ、違う型のリモコンが使えるようなのでSwitchBotで自動再生することにしました。リモコンはヤフオク、SwitchBotはAmazonで注文し、数日で届きました。設定も簡単でSwitchBotのiPhoneのアプリからオートメーション化でき、あっさり思っていたことができました。
【SwitchBotのアプリ(iPhone)でオートメーション → SwitchBotハブミニ → CDプレイヤー再生】
自動化その2:定休日を除く設定(誰かがスイッチを押す)
すぐできたので機嫌よくしていましたが、これだと休みの日にも爆音のラジオ体操が流れることに気が付きました。営業日は誰かが出勤して照明のスイッチをオンにしたり何かしらアクションがあるので、これをトリガーにしようかと考えました。が、流石に店舗のスイッチから電源引いて同期させるのも面倒。新たにスイッチを作ってもそれを押し忘れる、そもそも人間が介入するのを止める目的だったことを考えると、システムで自動化させる方が良い気がしてきました。
電源オンオフ→【SwitchBotのアプリ(iPhone)でオートメーション → SwitchBotハブミニ → CDプレイヤー再生】
自動化その3:定休日を除く設定1(GoogleCalendar+IFTTT)
定休日は僕らが勝手に決めているものなので、当然世の中に存在するアルゴリズムを使用するわけにもいきません。で、オートメーションといえばIFTTTだと知っていたので調べる。Google Calendarからデータが読み込めるっぽいので以下の通りにしました。
【IFTTT→Google Calendarに営業日・始業時間を入れトリガー→SwitchBotのアプリ(iPhone)→SwitchBotハブミニ→CDプレイヤー再生】
実際にやってみました。が、問題あり。Google Calendarの情報を撮りに行くのにタイムラグが結構あり、実際オートメーションを組んでも10分20分ズレて再生させることに・・・。これじゃダメだ。
自動化その4:定休日を除く設定2(ショートカットアプリ+カレンダーアプリ)
時間のトリガーはサーバーに上がっているものよりも、iPhoneなどの物理デバイスの方が強そうなので、IFTTTとは訣別し、iPhoneのショートカットアプリを使うことにしました。ショートカットアプリはGoogle Calendarと同期しないので、今度はiPhoneのカレンダーアプリにデータを飛ばし、それを読みに行くことに。
【GoogleCalendar→カレンダーアプリ(iPhone)→ショートカットアプリ(iPhone)でオートメーション→SwitchBotのアプリ(iPhone)→SwitchBotハブミニ→CDプレイヤー再生】
しかし今度は、カレンダーアプリの日付や時間そのものがトリガーとして機能しないことが発覚。ショートカットアプリのオートメーションにIF構文を入れることに。
自動化その5:オートメーションにIF構文を入れて組み直す
オートメーションアプリの時間をトリガーに、その日カレンダーにイベントがあるかないか、あった場合は鳴らす・ない場合はオートメーションを終えるというIF構文を組み込みました。理解すれば早いけど、意味がわかるまで時間がかかった・・・。ということでこうなりました。
【カレンダーアプリ(iPhone)】⇄【ショートカットアプリ(iPhone)でオートメーション→SwitchBotのアプリ(iPhone)→SwitchBotハブミニ→CDプレイヤー再生】
これでさすがにうまくいっただろうと思ったのですが、何回かオートメーションを実行しているうちに、ある条件だと時間通りに動かないことが発覚。iPhoneのスリープが原因でした。
ショートカットアプリそのものはバックグラウンドでも動くのですが、カレンダーアプリから情報を拾いにいくのがうまくいってないようで、更にiPhoneを手元で立ち上げた瞬間トリガーになってしまうという誤作動まで。鈍臭い。
自動化その6:iPhoneからの脱却
もうこうなったらiPhone使わずに、GoogleのAPIだけでなんとか動かそうと検討。GoogleCalendarのデータを元にするので、素直にAppsScript使うのが無難そう。
【GoogleAppsScript→GoogleCalendar→SwitchBotハブミニ→CDプレイヤー再生】
これは「SwitchBotのアプリを連打するとトークンが得られる」というスーファミみたいな裏技を見つけて思いついたのですが、勉強がてらAppsScript使って全てサーバー上で完結するようにしたかったわけです。
一度だけAppsScript使ったことがあったので概要は知っていました。GoogleCloud側でAPI使用の許可を与えて、それをAppsScriptで承認させて、Calendar読んで・・・。
しかしこいつが曲者で、何回やってもCalendar側にブロックされ、進まない。日本語で事例がなかったので英語の文献を読み漁り、なんとか理由を理解してブロックを解除。
AppsScriptがトリガーになるので、こいつに再生したい時間(8:25)を指定して・・・と思ったら、なんと8:00〜9:00というざっくりした時間指定しかできないことが発覚(宅急便かよ)。一応時間を指定するAPIもあったけど有料で腹立つ。
自動化その7:iPhoneへの回帰
結局コードはAppsScript上で動かすとして、トリガーそのものはiPhoneに戻すことにしました。
【ショートカットアプリ(iPhone)→GoogleAppsScript→GoogleCalendar→SwitchBotハブミニ→CDプレイヤー再生】
正確には
1. ショートカットアプリで毎日指定時間にAppsScriptへデプロイ。
2. AppsScriptでGoogleCalendarの予定を確認、本日予定があれば3、なければ4へ
3. SmartBotのAPIを呼び出す、CDプレイヤーが再生される
4. 終了
<まとめ>
コードは書けないので全部ChatGPTに書かせました。57行の短いコードなのでこの辺は別に苦労しませんでしたが、各サービス間のデータ送信受信が大変。概要がわかってないとツライ。
これを書いているのが実際にSwitchBotハブミニで再生する前日のこと。明日からうまくいくでしょうか。
<追記>
うまくいきました。完