GoogleHomeにお願いしてiPhoneを探してもらいます。

今回はAppleが提供している「iPhoneを探す」を利用して、どこかに無くしたiPhoneから音を出してもらいます。そのため、iPhone側に特にアプリを入れる必要は無く、マナーモードでも音が鳴ります。

■使用環境

GoogleHome → IFTTT → Beebotte → (Raspberry Pi +Node-RED)→pyicloud →iPhoneが鳴る

以下のサイト様を丸パクリしてNode-REDまで設定してます。
・IFTTT から Raspberry Pi に指示を出す

以下参考サイト様に倣って、Beebotteから順番に設定していきます。

各種設定

1. Beebotte

①Channelの作成

「Create new」を選択し、必要事項を入力して「Create Channel」を選択します。

Channel Name     :iPhone_find
Channel Description    :iPhone_find
Resource name     :action
Resource Description  :action

②Channel Tokenの確認

作成したChannelを選択し、Channel Tokenに表示されている文字列を記録します。

2. IFTTTの設定

①thisの設定

今回設定したのは以下の通りです。
・Google Assistantの「Say a phrase with a text ingredient」

項目 設定値
What do you want to say? iPhoneを $
What do you want the Assistant to say in response? iPhoneを鳴らします
Language Japanease

②thatの設定

・Webhooksを選択し、以下の通り設定しました。

項目 設定値
URL https://api.beebotte.com/v1/data/publish/iPhone_find/action?token=<Channel Token>
Method POST
Content Type application/json
Body {"data":"{{TextField}}"}

3. Raspberry Pi +Node-REDの設定

①Node-REDの起動

raspberryで以下のコマンドを実行して起動します。
node-red-pi --max-old-space-size=256 > /dev/null 2>&1 &

②Node-REDへアクセス

ブラウザで以下の通りアクセスします。
http://<Raspberry PiのIP>:1880

③mqtt inノード・json・debugの配置

mqtt inノードは、参考にさせていただいているサイト様と「トピック」以外は同じ設定にしました。

項目 設定値
トピック iPhone_find/action

そのほか、json・debugノードも参考サイト様同様に配置してます。

④Google Home → IFTTT → Beebotte → Node-REDの動作確認

Google Homeに「iPhoneを~」としゃべって、Node-REDのデバッグウィンドウに情報が表示されるかどうか確認します。

4. Raspberry PiからiPhoneを鳴らす設定

ここまでで、Google HomeからRaspberry Piに指示を送れるようになったので、残りのiPhoneを鳴らす仕組みを構築します。

iPhoneをRaspberry Piから探すには、以下のサイトで利用しているpyicloudライブラリを利用します。
iphoneを使って自分のGPS記録を取得する(アプリ未使用)

①pyicloudのセットアップ

上記記事の「環境準備」を参考に、Raspberry Piにライブラリをセットアップします。
その後、取得したい携帯電話のデバイスナンバーを取得します。

②iPhoneを探すためのプログラム

デバイスナンバーまで取得出来たら、以下の通り、iPhoneを鳴らすためのプログラムを作成します。

iphone_find.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from datetime import timedelta
from pyicloud import PyiCloudService
import commands
import time
#以下は接続するicloudのアカウントとパスワードを記載します。
api = PyiCloudService('XXXXXX@YYYYYYYYYY', 'password')

if api.requires_2sa:
    import click
    print "Two-factor authentication required. Your trusted devices are:"

    devices = api.trusted_devices
    for i, device in enumerate(devices):
        print "  %s: %s" % (i, device.get('deviceName',"SMS to %s" % device.get('phoneNumber')))

    device = click.prompt('Which device would you like to use?', default=0)
    device = devices[device]
    if not api.send_verification_code(device):
        print "Failed to send verification code"
        sys.exit(1)

    code = click.prompt('Please enter validation code')
    if not api.validate_verification_code(device, code):
        print "Failed to verify verification code"
        sys.exit(1)

def get_oauth():
    # デバイスナンバーは、icloudに登録しているデバイスに応じて数が異なる。
    auth = api.devices[1].play_sound()
    return auth

保存したら、認証を通すため一度実行します。

python iphone_find.py

実行すると、iphone側にicloudにログインする通知が出るので許可します。
※場所が自分がいる場所とは異なることがあります。

その後、コンソール上に以下のコメントが出るため、SMSの送り先があっていたらEnterを押します。

~~SMS to~~
Which device would you like to use?', default=0

Enter押下後、iPhoneにSMSで確認番号が送られてきますので、以下の表示が出た後に入力し、Enterを押します。
Please enter validation code

認証が正しく実行されると、数秒後にiPhoneから音が出てきます。

5. Node-REDからPythonの実行設定

先ほど設定したNode-REDのjsonの後ろに「exec」ノードを追加します。
コマンド欄に先ほど作成したpythonの実行コマンドを入力します。

項目 設定値
コマンド python ~/iphone_find.py

6. 終わりに

今回は、iPhoneを探すのにiCloudの正式サービスである「iPhoneを探す」を利用して音を出してみました。部屋の中で携帯をなくすことが多々ありますが、基本マナーモードにしているのでそれでも音が鳴るのは助かります。
私自身、2年以上pyicloudを利用して今回とは別にiPhoneのGPS情報を記録していますが、特に不便なく利用できています。

今後は、役に立つかわかりませんが、GoogleHomeにiPhoneの位置を聞くと、GPS情報から地図上にピンを打った画像を作成し、ChromeCastにフォトとして表示する等情報を画像として表示する方向でごゆるり実現出来たらと思ってます。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.