14
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SwiftAdvent Calendar 2020

Day 12

ラズパイとSwiftでSlackに投稿ボタンをつくろう!

Last updated at Posted at 2020-12-11

Raspbian-10 Swift-5.1.5 SwiftyGPIO-1.3.1

はじめに

最近ラズパイをさわり始めました。せっかくなので Swift とラズパイで Slack で今日は休む旨を伝えるボタンを作りたいと思います!

こんな感じです。

bot_user

必要なもの

今回必要なものは下記です。

  • 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 に投稿にはトークンが必要なので準備します。

  1. Slack API にアクセスし App Name と Workspace を入力し Create App をクリックする。

    create_app
  2. 左側メニューの OAuth & Permissions をクリックする。

  3. Scopes -> Bot Token Scopes に chat:write を追加する。

  4. OAuth & Permissions ページの上部にある Install App to Workspace をクリックする。

  5. インストール後下記が表示されるのでトークンをコピーする。

    token
  6. Slack の投稿したいチャンネルにアプリを追加する。

    add_app

配線

GPIO

公式ドキュメントから引用

配線は下記です(上の図を参考にどうぞ)。

  1. ブレッドボードの j30 にジャンバ線1のオスを挿す。
  2. ブレッドボードの j28 にジャンバ線2のオスを挿す。
  3. ブレッドボードの j23 にジャンバ線3のオスを挿す。
  4. 抵抗をブレッドボードの i23 と i28 に挿す。
  5. ボタンをブレッドボードの f30, e30, f28, e28 に挿す。
  6. ジャンバ線1のメスをラズパイの 3.3V に挿す。
  7. ジャンバ線2のメスをラズパイの GPIO9 に挿す。
  8. ジャンバ線3のメスをラズパイの GPIO11 横の GND に挿す。

ラズパイ準備

いよいよ Swift でコードを書いていきます。

  1. SSH 接続する。

  2. 下記コマンドで必要なものを準備する。

    // ディレクトリ作成
    $ mkdir SlackPost
    
    // ディレクトリに移動
    $ cd SlackPost
    
    // プロジェクト初期化
    $ swift package init --type executable
    
    // Package.swift編集
    $ vim Package.swift
    
  3. i と入力し入力モードにする。

  4. 下記を追記する。

    // 省略
    dependencies: [
        .package(url: "https://github.com/uraimo/SwiftyGPIO.git", from: "1.0.0") // ここ追加
    // 省略
    targets: [
        .target(name: "SlackPost", dependencies: ["SwiftyGPIO"]), // ここ追加
    // 省略
    
  5. 下記コマンドを実行する。

    $ vim Sources/SlackPost/main.swift
    
  6. i と入力し入力モードにする。

  7. 下記のようにソースを記述する。

    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
    }
    

起動

投稿ボタン起動!!

  1. ラズパイに SSH 接続する。

  2. 下記コマンドで起動する。

    # ビルド
    $ swift build
    
    # 実行
    $ swift run
    

これでボタンを押せば Slack に投稿できます!(終了する場合は ctrl + C)

bot

ちょっと改良

このままだとボットが休むことを伝えることになります。休む場合は自分で伝えるべきでしょう!

Slack API の OAuth & Permissions ページにアクセスし Scopes の User Token Scopes に chat:write を追加し App の reinstall を行います。

scope

下記のように OAuth Access Token が発行されるのでこのトークンを使うようにします。

token

起動!!

bot_user

無事自分の口で休むことを伝えることができるようになりました:clap:

おわりに

これで朝起きたらボタン一つで休めるようになりました:relaxed:

私が言いたかったのは Swift でできるのは iOS, Mac アプリを作ることだけじゃない!!!ということです:sunglasses:

参考

14
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?