はじめに
最近ラズパイをさわり始めました。せっかくなので Swift とラズパイで Slack で今日は休む旨を伝えるボタンを作りたいと思います!
こんな感じです。
必要なもの
今回必要なものは下記です。
- microSD カード
- Raspberry Pi 3 Model
なんとなく3買いましたが4の方がいいと思います(4の場合電源は USB-C です)。 - マイクロ USB 電源コード
- 10 K の抵抗×1
- スイッチ×1
- オスーメスジャンバ線×3
- ブレッドボード
具体的なのは下記参照
MacでラズパイのLチカしてみたー必要なもの
ラズパイ設定
OS のインストールや SSH 接続までは下記参照
MacでラズパイのLチカしてみたーSD 準備
Swift のインストール
ラズパイに Swift をインストールします!手順は簡単です。
ラズパイに SSH 接続して下記コマンドを実行します。
# Swift-Armのインストール
$ curl -s https://packagecloud.io/install/repositories/swift-arm/release/script.deb.sh | sudo bash
# Swift のインストール
$ sudo apt-get install swift5
最初の curl コマンドで OS を調べて適切なものを色々インストールしてくれます。
インストール後に下記コマンドを実行してバージョンが表示されれば成功です。
$ swift --version
Swift version 5.1.5 (swift-5.1.5-RELEASE)
Target: armv6-unknown-linux-gnueabihf
参考:Raspberry Pi で Swift を使えるようにする【Swift 5】 - Swift-Arm の入手
ついでに vim もインストールしておきます(ソース書くとき使います)。
$ sudo apt-get install vim
Slack 準備
Slack に投稿にはトークンが必要なので準備します。
-
Slack API にアクセスし App Name と Workspace を入力し Create App をクリックする。
-
左側メニューの OAuth & Permissions をクリックする。
-
Scopes -> Bot Token Scopes に chat:write を追加する。
-
OAuth & Permissions ページの上部にある Install App to Workspace をクリックする。
-
インストール後下記が表示されるのでトークンをコピーする。
-
Slack の投稿したいチャンネルにアプリを追加する。
配線
配線は下記です(上の図を参考にどうぞ)。
- ブレッドボードの j30 にジャンバ線1のオスを挿す。
- ブレッドボードの j28 にジャンバ線2のオスを挿す。
- ブレッドボードの j23 にジャンバ線3のオスを挿す。
- 抵抗をブレッドボードの i23 と i28 に挿す。
- ボタンをブレッドボードの f30, e30, f28, e28 に挿す。
- ジャンバ線1のメスをラズパイの 3.3V に挿す。
- ジャンバ線2のメスをラズパイの GPIO9 に挿す。
- ジャンバ線3のメスをラズパイの GPIO11 横の GND に挿す。
ラズパイ準備
いよいよ Swift でコードを書いていきます。
-
SSH 接続する。
-
下記コマンドで必要なものを準備する。
// ディレクトリ作成 $ mkdir SlackPost // ディレクトリに移動 $ cd SlackPost // プロジェクト初期化 $ swift package init --type executable // Package.swift編集 $ vim Package.swift
-
i と入力し入力モードにする。
-
下記を追記する。
// 省略 dependencies: [ .package(url: "https://github.com/uraimo/SwiftyGPIO.git", from: "1.0.0") // ここ追加 // 省略 targets: [ .target(name: "SlackPost", dependencies: ["SwiftyGPIO"]), // ここ追加 // 省略
-
下記コマンドを実行する。
$ vim Sources/SlackPost/main.swift
-
i と入力し入力モードにする。
-
下記のようにソースを記述する。
import Foundation import FoundationNetworking import SwiftyGPIO extension String { var urlEncoded: String { let charset = CharacterSet.alphanumerics.union(.init(charactersIn: "!$&'()*+,;=/?-._~")) let removed = removingPercentEncoding ?? self return removed.addingPercentEncoding(withAllowedCharacters: charset) ?? removed } } func postMessage(channel: String, text: String) { let token = "調べたトークン" var request = URLRequest(url: URL(string: "https://slack.com/api/chat.postMessage")!) var components = URLComponents(url: request.url!, resolvingAgainstBaseURL: true) components?.percentEncodedQuery = "token=\(token)&channel=\(channel)&text=\(text)".urlEncoded request.url = components?.url let task = URLSession.shared.dataTask(with: request) { (data, response, error) in if let error = error { print("error: \(error.localizedDescription)") return } if let data = data, let textData = String(data: data, encoding: .utf8) { print(textData) } } task.resume() } let gpios = SwiftyGPIO.GPIOs(for: .RaspberryPi3) var gp = gpios[.P9]! gp.direction = .IN var before = 0 while true { let now = gp.value if before == 0 && now == 1 { print("Push!!!") postMessage(channel: "#random", text: "ぽんぽんぺいんで今日休みます:dizzy_face") } Thread.sleep(forTimeInterval: 0.1) before = now }
起動
投稿ボタン起動!!
-
ラズパイに SSH 接続する。
-
下記コマンドで起動する。
# ビルド $ swift build # 実行 $ swift run
これでボタンを押せば Slack に投稿できます!(終了する場合は ctrl + C)
ちょっと改良
このままだとボットが休むことを伝えることになります。休む場合は自分で伝えるべきでしょう!
Slack API の OAuth & Permissions ページにアクセスし Scopes の User Token Scopes に chat:write を追加し App の reinstall を行います。
下記のように OAuth Access Token が発行されるのでこのトークンを使うようにします。
起動!!
無事自分の口で休むことを伝えることができるようになりました
おわりに
これで朝起きたらボタン一つで休めるようになりました
私が言いたかったのは Swift でできるのは iOS, Mac アプリを作ることだけじゃない!!!ということです