Python
ifttt
RaspberryPi

にゃーんボタンを作る

目的

にゃーんしたいときににゃーんとツイートしたい

にゃーんボタン1号

IFTTTでつくった.
スケッチ.png

ボタンが押されると現在時間とともにツイート.
スマホやAppleWatchで使えてとても便利
Screenshot_20170818-121248.png
IMG_-96qcj7.jpg

問題点

投稿文が にゃーん August 24, 2017 at 03:45AM のようになってしまい,1分以内だと投稿の重複により投稿できない.にゃーんを連投したい時もあり困る.

にゃーんボタン2号

家にラズパイがあるのでそいつに仕事してもらいたい
練習として,IFTTTでWebhookしてみる
IFTTTでWebhook飛ばすアプレットと受け取るアプレットを作ってみた.

maker.ifttt.com-use-dFATP1QGninuFBL9kK7NLv(Laptop with HiDPI screen).png
IFTTTでWebhookのSettingを開くとこんな感じでPOSTするといいよみたいなURLが表示されるのでそれをそのまま使えばよかった.Webhookめっちゃ便利
curlの入力例も表示される

Webhook飛ばすやつ

ifttt.com-applets-59725732d--edit(Laptop with HiDPI screen).png

Webhook受け取るやつ

ifttt.com-applets-59725732d--edit(Laptop with HiDPI screen) (1).png
飛ばすやつで決めたイベント名を指定する.

2号もいい感じに動く.あとは飛ばす方をラズパイにお願いするだけ.

にゃーんボタン3号

ラズパイと言えばPythonらしいのでPythonをつかうことにした

import wiringpi as pi ,time,requests,datetime
SW_PIN = 15 # スイッチがつながってるピン番号
url='https://maker.ifttt.com/trigger/python1/with/key/******'
swi=0
pi.wiringPiSetupGpio()
pi.pinMode(SW_PIN,pi.INPUT)
pi.pullUpDnControl(SW_PIN,pi.PUD_DOWN)

while True:
    if(pi.digitalRead(SW_PIN)==pi.HIGH):
        if(swi==0):
            print("Switch ON")
            str = datetime.datetime.now().strftime('%H:%M:%S')
            payload = {'value1':str}
            requests.post(url,data=payload)
            swi=1
    else:
       print("Switch OFF")
       swi=0
    time.sleep(0.01)

swi にスイッチのオンオフを保持し,0→1になった時に時刻を取ってきてwebhook先に飛ばす.

payload = {'value1':str}
requests.post(url,data=payload)

とすることで時刻データを飛ばすことができる.
IMG_-x10jmo.jpg
ボタンを押すと投稿

問題点

POSTの送信に時間がかかってしまい,送信中は連打してもにゃーんしてくれない.もっと連打したい

にゃーんボタン4号

送信部だけスレッド化して非同期にしたい.
調べたらPythonにサブスレッドを作る機能があったけどよくわからないのでバックグラウンドで送信部だけ動かすことにしたら解決してしまった.

送信部を nyaan.py に分け,os.system('sudo python3 nyaan.py &') に書き換えるだけで解決してしまった.
これでにゃーんボタンを連打しても最短1秒間隔でにゃーんすることができる.理想的だ.

問題点

毎にゃーんごとに sudo python3 nyaan.py & を実行することになるのでちょっと残念.
コンパイルしておきたいけど眠いからまた今度やる.

にゃーんボタン5号

連打の機運が高まってしまったのでミリ秒表示に対応する.
今までの仕様では1秒に1ツイートが限界だった(ツイートの重複)

now = datetime.datetime.now()
str = now.strftime('%H:%M:%S.') + "%03d" % (now.microsecond // 1000)

むずかしいぷろぐらみんぐよくわかんないから http://shohu.hatenablog.com/entry/20081117/1226936130 ここをそのままうつした.

結果

理論的には1秒に1000連打しても問題なくツイートできる.

にゃーんボタン6号

あれからいろいろあってマルチスレッドになったりスピーカーから音が出るようになった

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading,tweepy,datetime,kjfsm4,wiringpi as pi,time

import pygame.mixer

SW_PIN = 14
swi=0
pi.wiringPiSetupGpio()
pi.pinMode(SW_PIN,pi.INPUT)
pi.pullUpDnControl(SW_PIN,pi.PUD_DOWN)

auth = tweepy.OAuthHandler(kjfsm4.consumer_key,kjfsm4.consumer_secret)
auth.set_access_token(kjfsm4.access_token,kjfsm4.access_secret)
api = tweepy.API(auth)

pygame.mixer.init()
pygame.mixer.music.load('nyan.mp3')

def tweet():
    pygame.mixer.music.play(1)
    print("tweet")
    now = datetime.datetime.now()
    str = now.strftime('%H:%M:%S.') + "%03d" % (now.microsecond // 1000)
    print (str)
    str = 'にゃーん '+str
    api.update_status(str)

while True:
    if(pi.digitalRead(SW_PIN)==pi.HIGH):
        if(swi==0):
            th_me = threading.Thread(target=tweet,name="th_me")
            th_me.start()
            swi=1
    else:
       swi=0
    time.sleep(0.01)