おまけ2. Webhook連携 – GoogleHomeからラズパイを動かす
この記事はiOSDC2022で発表したセッション、Swiftで我が家を より便利に、安全に!の発表のおまけ記事第2弾です。
もしまだ本編を読んでいない方は読んでいただけると!
この記事では、GoogleHomeからラズパイに接続したモーターを動かす方法を紹介します!
GoogleHomeからラズパイに繋いだモーターを動かす
今回の発表に向けて、色々電子工作用の道具やパーツを買ったのですが、モーターが余っていたので、せっかくなら、モーターにファンをつけて、扇風機として使えないかな?と思ったので、我が家にあるGoogleHomeから動かせるようにしてみました!
実装イメージは以下の図の通りです!
GoogleHomeをトリガーに、IFTTTを使って、SwiftHomeServerの扇風機起動用のAPIへPostします。
そしてそこから、ラズパイにWebSocketを使って、Postされたことを通知し、そこからラズパイに繋がったモーターを動かして、ファンを回します!
なお今回モーターとファンを台に固定するのに、iOSDCのノベルティの扇風機とケーブル用のバンド、いつも使ってるスマホスタンドを使いました!
ノベルティありがとうございます!!
IFTTTでは、以下のように、GoogleSpeech(GoogleHomeなどで話したことをトリガーにする)→SwiftHomeServerにPostするように設定しています!
SwiftHomeServerのコードは以下の通りで、扇風機ON、OFF以外のAPIをまとめて定義できるように、forEachでループして定義しています。
Postされたタイミングで、WebSocketにエンドポイントの文字列を送信するように実装しています。
ちなみにVaporを使った、APIの実装方法については、以下の記事で紹介しています!
let endPointList: [EndPointKind] = [.fanOn, .fanOff, .doorOpenDetected]
endPointList.forEach { kind in
protected.post(.constant(kind.endPoint)) { request async throws -> HTTPResponseStatus in
try await eventNotificationSocket?.send(kind.endPoint)
return .ok
}
}
protected.webSocket(.constant(EndPointKind.eventNotification.webSocketEndPoint)) { request, ws in
eventNotificationSocket = ws
webSocketOnlineSocket?.send(WebSocketStatus.piOnline.rawValue)
// (Omit)
}
最後にラズパイからモーターを起動する処理です。
単純にモーターを動かすだけなら、電気を流すor流さないを制御すればOKです!
市販の扇風機のように、風量(モーターの回転数)を制御したい場合は、もう少し凝った実装が必要になりますが、ここでは省略します(今後機会があれば、記事にしたいと思います)!
GPIOピンは任意のもので、大丈夫です!
let gpios = SwiftyGPIO.GPIOs(for: .RaspberryPi4)
let motorGpio = gpios[.P13]!
motorGpio.direction = .OUT
// Turn on motor
motorGpio.value = 1
// Turn off motor
motorGpio.value = 0
実際にこれでうまく動くと↓の動画のようになります!
まとめ
今回はGoogleHomeからラズパイに繋がったモーターを動かす方法を紹介しました!
元々IFTTTを使うことで、かなり色々なことができましたが、ここにラズパイも活用することで、さらに色々なことができるようになりました!
普段やっているiOS開発や、電子工作、スマートホーム化など、アイデア次第で色々なことができるようになるのは、やっていてとてもわくわくするので、楽しいです!!
(おまけ記事なので、少し書き方が雑になってしまいました。。笑)