クリスマスにデートを楽しんでいる人々から幸せをもらうIoT

[IoTLT Advent Calendar 2018(neo)](https://qiita.com/advent-calendar/2018/iotlt_neo)の12月7日を担当します、 @mii-chang です！:sunny:
新卒1年目で、普段はモバイルアプリエンジニアとして、日々アプリを作っています。

普段はソフトウェアばかりやっているので、ハードウェアが気になるお年頃…
趣味程度ですが電子工作を勉強中なので、今回はクリスマス的なIoTをすることにしました:santa_tone1:

# クリスマス
…それは恋人たちがキラキラとした街で幸せなひとときを過ごすロマンチックな日………

マライア・キャリーも、All I Want for Christmas is Youと言っていますね。

クリスマスには多くの恋人たちがデートをしていて、幸せいっぱいな気持ちになっているはず…
そんな特別な日の特別な気持ちを、たとえお家にいたとしても共有しちゃおう！と思って作ったのが、今回の **IoTクリスマスツリー** です

![img](https://media.giphy.com/media/5kFWudBffuR9MHFv9T/giphy.gif)


# 用意したもの
- ダイソーで200円位で売っていた、キラキラのきれいなLEDガラスツリー
![IMAG0260.jpg](https://qiita-image-store.s3.amazonaws.com/0/93899/ffbb121c-46c9-6e4d-2a18-3396c2b9a0d4.jpeg)

- Raspberry pi 3 Model B

- ブレッドボードとか各種ワイヤー・抵抗（LED光らせられる材料）

# 仕組み
## どうやって幸せをもらうのか
クリスマスにデートを楽しんだ人たちが、Twitterに、「今日のデート楽しかったな:relaxed:」とつぶやくと、ツリーが光ります。
ツリーが光ったら、誰かがデートを楽しめたということなので、「おお、誰かが楽しくデートできたんだなあ。良かったなあ。」とTwitterとツリーを介して、誰かの幸せをおすそ分けしてもらいましよう。

## 技術的な仕組み
1. PythonでTwitterのSearchAPIを使って、 **デート　楽しかった** のキーワード検索に引っかかるツイートを探す
2. キーワードに一致する新着ツイートがあったら、RaspberryPiのGPIOを操作してクリスマスツリーのLEDを光らせる
3. ほっこり。

# 接続
普通にLEDを光らせるときの感じでつなぎます。
ツリーの底の蓋を剥がして、直接つなぎました
![IMAG0261.jpg](https://qiita-image-store.s3.amazonaws.com/0/93899/c91ba8f0-a558-1ae1-8b38-b2e7707c9a8d.jpeg)


# 実装
今回は[TwitterAPI](https://developer.twitter.com/en/docs/api-reference-index)の中の、[SearchAPI](（https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets.html）)を使いました

## Twitterデベロッパー登録
TwitterAPIを使うにはデベロッパー登録が必要で、最近各項目が増えてちょっぴりめんどくさくなってしまったのですが、[こちらの記事](https://qiita.com/kngsym2018/items/2524d21455aac111cdee
)がとっても丁寧にまとめられていました。デベロッパー登録については、この記事を参考にしていただき、今回ここで説明するのは割愛します。

## コード
```detetree.py
# coding:utf-8
import json,Config, time, threading, RPi.GPIO
from requests_oauthlib import OAuth1Session

#TwitterAPIから取得したkeyの情報
key = consumer_key
secret = consumer_secret
token = access_token
tokenSeclet = access_token_secret

twitterOauth = OAuth1Session(key, secret, token, tokenSeclet)
url = 'https://api.twitter.com/1.1/search/tweets.json'
params = {'q' : 'デート 楽しかった', 'count' : 1} #検索ワード（検索パラメーター）の設定

tweetId = 0
gpioPin = 17 #ブレッドボードにつないでるラズパイのGPIOピン番号

def initGpio():
    print("Initialize port")
    RPi.GPIO.setmode(RPi.GPIO.BCM)
    RPi.GPIO.setup(gpioPin, RPi.GPIO.OUT)
    RPi.GPIO.output(gpioPin, 0)

def getTweet():
    result = twitterOauth.get(url, params = params)
    global tweetId
    try:
        timelines = json.loads(result.text)
        timelines = timelines['statuses'][0]
        print(str(tweetId))

        # ツイートのIDを取得して、前に取得したIDと異なるIDだったら新着ツイートとみなす
        if timelines['id'] != tweetId:
            tweetId = timelines['id']

            #新着ツイートの更新があったら4秒光らす
            RPi.GPIO.output(gpioPin, RPi.GPIO.HIGH)
            time.sleep(4)
            RPi.GPIO.output(gpioPin, RPi.GPIO.LOW)

        else:
            print('更新がないよ')

    except:
        print('error')
        import traceback
        traceback.print_exc()

initGpio()

while True:
    print('true')
    getTweet()
    time.sleep(5) #5秒に1回ツイートを取得

RPi.GPIO.cleanup()

```

TwitterのフリーのSearchAPIが、https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets.html によると、  

| Response formats | JSON |
|:--|:--|
| Requires authentication? | Yes |
| Rate limited? | Yes |
| Requests / 15-min window (user auth) | 180 |
| Requests / 15-min window (app auth) | 450 || Requests / 15-min window (user auth) | 180 |

ということで、15分で180回までしかリクエストを送れない = 5秒に1回しかリクエストを送れないということだったので、5秒に1回”デート　楽しかった”のツイート検索を行っています。
このキーワードに一致するツイートがあった場合、4秒ツリーを光らせています。

#実演


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">クリスマスなので、「デート　楽しかった」を含むつぶやきがされたら光るクリスマスツリーを作りました。(4倍速) <a href="https://t.co/bBYoPBuJkZ">pic.twitter.com/bBYoPBuJkZ</a></p>&mdash; Miyuu🍙📻👩‍💻 (@miichang_tw) <a href="https://twitter.com/miichang_tw/status/1071059352310566912?ref_src=twsrc%5Etfw">2018年12月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>




4倍速です

"デート　楽しかった"ってツイートしてる人がそんなにいなかったので、あまり光りません:joy:
デートの投稿はTwitterよりもinstagramのほうが多い気もしますね…！:thinking:

# さいごに
お部屋においておくだけで世のクリスマスの幸せ気分を感じれるツリー。ロマンチックじゃありませんか？