iOSショートカットで、トグルスイッチでない電化製品のスイッチをトグル化してみました。
目次
トグルではないスイッチをトグル化したい
自宅の照明を赤外線リモコンで操作できるようにしています。
このリモコンをNature Remoに登録しているので、Googleアシスタント、Amazon Alexaなどでスイッチのオンオフができます。
もちろんiPhoneのショートカットでも。
ショートカットをウィジェットで使う時に「ON」「OFF」のふたつのボタンを配置するが、照明の操作だけでふたつ分のボタンスペースを使うのはもったいない。
照明が点灯している時に「ON」を押すことはないし、逆に照明が消えている時に「OFF」を押すこともないのだから、ひとつのスイッチに、照明が消えている時には「ON」の機能を、ついている時には「OFF」の機能を持たせたいところ。
つまり「トグル化」したい。
そこで、トグルでないスイッチをiPhoneのショートカットでトグル化する方法を考えてみました。
照明ステータスを保存する
本記事では、「照明を点灯する」と「照明を消灯する」のふたつのショートカットを、「照明ON/OFF」というひとつのショートカットにまとめてトグルボタンにします。
そもそもトグルでないスイッチは、信号を投げっぱなしで、対象のデバイスが現在どのような状態になっているかという情報を知ることができません。
だから今回方法として考えたのは、
「いま照明が点灯しているのか、消灯しているのか」(以下「照明ステータス」と呼ぶことにする)
をクラウド上に保存しておいて、ボタンが押されたらそこからステータスを引っ張ってきて条件式で振り分けてアクションを実行する、という流れ。
まずはその照明ステータスをどこに保存するか。
結論から書くと、Google SheetsのスプレッドシートをGoogleドライブに保存します。
その理由。
ほかにGoogleアシスタント、Amazon Alexa、IFTTTなど、どこから操作されてもひとつのステータスファイルにアクセスできるようにしたい。
クラウドの保存場所としてはDropboxやiCloud Driveが思い浮かびますが、DropboxはIFTTTのアクションは存在するものの、ファイルの内容を更新することができないし、iCloud DriveはそもそもAppleデバイス以外からアクセスできず、他から更新ができません。
iOSショートカット、Googleアシスタント、Amazon AlexaからはすべてIFTTTのアクションを実行することができるので、照明ステータスの更新はIFTTTに担わせることにしました。
IFTTTのアクションでクラウド上のファイルの内容を更新できる方法を探したところ、これが可能なのはGoogle Sheetsチャンネルだけだったので、Google Sheetsを使用することにします。
一方、照明ステータスをiOSショートカットへ引っ張ってくるためには、考えうる限りGoogle Apps Script(GAS)を使うしかないようなので、GASを使うことにします(後述)。
【Google Sheets】照明ステータスファイルの作成
新規スプレッドシートを作成したら、任意のセルに現在の照明ステータスを入力します。
ここでは点灯時のステータスを「on」、消灯時を「off」と決めて、A1セルに「off」と記入しました。
任意のファイル名をつけて、Googleドライブ内に保存します。
【IFTTT】照明ステータスを更新するアクションを作成
照明ステータスを更新する場面は、
- IFTTTのアプレットで照明を操作する場合
- IFTTT以外から照明を操作する場合
の2パターンあります。
1. IFTTTのアプレットで照明を操作する場合
IFTTTで照明を点灯/消灯するアクションを持つアプレットに、Google Sheets > Update cell in spreadsheet でGoogle Sheetsを更新するアクションを追加しておきます。
点灯するアクションはValueの値をonに、消灯するアクションはValueの値をoffに。
2. IFTTT以外から照明を操作する場合
iOSショートカット、Googleアシスタント、Amazon Alexaなど、IFTTT以外から照明を操作する場合は、それぞれのアクション実行後にIFTTTのアプレットを実行するアクションを実行します。
それぞれのサービスからIFTTTアプレットを実行する方法はこちらの記事を参照。
iOSショートカットでGoogle Sheetsのデータを取得する
iOSショートカットから直接Googleドライブのファイルにアクセスすることはできないので、Google Apps Script(GAS)を使ってデータを抽出します。
このブログでは誰でも使える方法を紹介することをモットーとしているので、スクリプトはあまり使いたくないところなのですが、今のところこれしか方法が思い浮かばない。
僕自身GASに関しては初心者なので、初心者でもわかるレベルで紹介します。
Google Apps Script(GAS)で照明ステータスを送るスクリプトを書く
GASの使い方は省略。
以下のコードを書きました。
function doGet() { var ss_id = '********************************************'; //スプレッドシートのIDを指定 var sh_name = 'シート1'; //スプレッドシートのシート名を指定 var sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name); var range = sh.getRange(1,1); //A1セルを取得 var cellValue = range.getValue(); var out = ContentService.createTextOutput(cellValue); return out; }
3行目には上で作ったスプレッドシートのIDを入力します。
IDはスプレッドシートのURLの下記の*******…の部分になります。
4行目にはスプレッドシートのシート名を入力します。
6行目には取得したいセル(今回はA1セルに入力したので ( 1 , 1 ) )を入力します。
単にA1セルをチェックして、その値を返すだけのスクリプトです。
これを保存。
【iOSショートカット】照明ステータスを取得する
いきなりひとつのショートカットを作ってもいいのですが、ややこしくなりそうなので、まずは「照明ステータスを取得するショートカット」を作り、トグルスイッチのショートカット内でそのショートカットを実行する形にします。
まずは照明ステータスを取得するだけのショートカットを作ります。
GASのスクリプトの右上の「デプロイ」プルダウンメニューから「デプロイを管理」をクリックすると表示される画面で「ウェブアプリ」のURLをメモ。
iOSショートカットで新規ショートカットを作成します。
「URL」アクションに先ほどメモしたウェブアプリのURLを入力。
「URLの内容を取得」アクションで、方法は「GET」を選択。
このショートカットを「照明ステータスを取得」という名前で保存。
照明をトグルスイッチにするショートカット
ようやくここまでやってきました。
このようなショートカットを作りました。
「ショートカットを実行」アクションで、先ほど作った「照明ステータスを取得」ショートカットを選択。
データをテキストとして取得して、その内容(onまたはoff)を判別する。
onなら照明をオフにして、照明ステータスをoffに更新する。
そうでなければ(offなら)照明をオンにして、照明ステータスをonに更新する。
これで完成。
ちゃんと点灯しているときに押すと消灯して、消灯している時に押すと点灯しました。
ボタンスペースを節約できました!
さいごに
注意事項としては、
「以後この操作は必ずステータスを更新できるアプリやデバイスから実行する」
(= IFTTTに繋がらないアプリやデバイスからは操作しない)
ということ。
ステータスの更新はIFTTTに担わせているため、照明器具につけた赤外線デバイス付属の物理リモコンやNature Remoのアプリからはステータスが更新できないので、今後は使いません。
今回の場合は照明を操作するアクションをiOSショートカット、Googleアシスタント、Amazon Alexa※、IFTTTと至る所に作っていたので、すべてのアクションにステータスを更新するアクションを追加しておかないといけなくて、それを探すのが大変でした。
ステータスを更新するアクションのない操作を実行するとステータスが狂って、トグルショートカットがうまく動作しません。
といってもその時もステータスはちゃんと更新されるので、もう一度実行すれば正しく戻ります。
(参考記事)以前もGoogle Sheetsにステータスを保存して判別するIFTTTアプレットを作っています。