ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

Raspberry PiでポケモンGoの出現通知をスマホに送る

やりたいこと

自宅にいるときに、たまにポケモンが現れるようなので、ポケモンGoを起動していない状態でもスマホへ通知したい。

f:id:mczh:20160730142916j:plain

実施した手順をメモしておく。

Botを動かそう

VPSもAWSアカウントも持っていない貧者なのでRaspberry PiでSlackBotを動かすことでインフラをサボることにする。

タイトルにラズパイっていれたけれど、特にセンサーを使ったり持ち歩いたりは想定せず、24時間起動しっぱなしのLinuxサーバとしてしか使っていない。

事前準備

PokemonGo-SlackBotインストール

pythonはRaspberryPiに元から入っていたか覚えていないが、なければインストールしておく(ここでは省略)。

git clone https://github.com/rubenmak/PokemonGo-SlackBot.git
cd PokemonGo-SlackBot
sudo pip install -r requirements.txt

PokemonGo-SlackBot実行

./pokeslack.py -L ja -u トレーナークラブユーザ名 -p パスワード -l "GoogleMap座標" -st インターバル -r 探索半径(m) -sw  WEBHOOK_URL

slackからスマホへ通知が来るかを確認する。

ポケモンアイコンの設定も出来るが、面倒なのでいったん省略した。

これで、PokemonGoのアプリを起動していなくても、出現したら通知が来るようになった。

通知の例

Skackの通知でタマタマがいるぞとと出たのでPokemonGoを起動すると・・・

f:id:mczh:20160730143621j:plain

ちゃんとタマタマがいた。

f:id:mczh:20160730143432j:plain

ほかにやっておきたいこと

  • 自動起動(サービス化)
  • 会社に行っているときは通知が無駄なので、時間制御か在宅制御を入れる

あたりはやろうと思う。 あと、たまに落ちるのでcronで生存チェックなどもしたほうが良いのかも。

追記

結構落ちることがわかったので、やっつけでcrontabで強制終了&復帰するようにした。 6-23時の間、29分と59分にプロセスを殺して、30分と0分に起動させる。(動作確認中) ちゃんとやるなら、ログを書き出してgrepしてリスタートする仕組みをいれるべきだと思う・・・。せめてエラー吐いていないときはkillしないぐらいの工夫はしたほうが良さそう。

sudo crontab -e
#以下を追加
0,30 6-23 * * cd /home/pi/PokemonGo-SlackBot && ./pokeslack.py -L ja -u username -p password -l "GoogleMapPosition" -st Interval -r Radius -sw  https://hooks.slack.com/services/hogehoge > /tmp/poke.log \
&
59,29 6-23 * * * kill `ps -aux | grep pokeslack.py | awk {'print $2'}`

続き

denpa-shinbun.com

Raspberry Piで温度と湿度を取得する

denpa-shinbun.com

今回はDHT11による温度と湿度の取得である。

精度はあまり良くないので、温度は前回のDS18B20のほうが良さそうだ。

denpa-shinbun.com

配線

VCCを5Vに、DATAを任意のGPIOピンに、GNDはそのままGNDピンに接続する。

f:id:mczh:20160719230019j:plain

3.3Vでも動くようだが、精度が悪くなるらしい。

チラシの裏の電子工作 激安温湿度センサDHT11を使ってみた やはり5V付近では概ね正しい値が出ているようです。 4.3Vを割ったあたりから、急激に計測値が悪化しているのが解ります。 http://nax9800.blog.fc2.com/blog-entry-44.html

ライブラリのインストール

PythonのライブラリがGitHubで公開されているので、それを使うのが楽。

Adafruit Python DHT Sensor Library

github.com

このリポジトリをクローンしてきて、README.mdに書いてあるようにセットアップする。 具体的には以下のように。

sudo apt-get install -y git
sudo apt-get update
sudo apt-get install -y build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

値の取得

まずはサンプルを試す。 exampleフォルダにある、AdafruitDHT.pyの第一引数に11、第二引数にGPIOピンの番号を渡す。 たとえば、GPIOピンが18の場合には、以下のようになる。

[pi@ras01: ~/Adafruit_Python_DHT/examples 22:50:11]master
$ ./AdafruitDHT.py 11 18
Temp=28.0*  Humidity=39.0%

こんな感じで、温度が28℃の湿度が39%とわかる。

ちなみに、昨日の温度センサーの場合には、以下のようになった。

$ ./getDs17b20SensorValue.sh
26937

1℃ほど低い。

DHT11は、値段が安いかわりに精度はイマイチな代物らしい。

これで温度、湿度が取得可能になった。RaspberryPiをWEBサーバ化してグラフを見られるようにするのも良いが、GoogleSpreadSheetに保存するとバックアップが不要になるので、GoogleSpreadSheetへの保存を目指したい。

Raspberry Piで温度取得

denpa-shinbun.com

で購入したDS18B20を温度センサーとして用いる。

モジュール有効化

sudo modprobe w1-gpio
sudo modprobe w1-therm

内蔵プルアップ抵抗を有効にする

ここではGPIOピン4番を用いる。

sudo emacs /boot/config.txt
dtoverlay=w1-gpio-pullup,gpiopin=4

を追記し、再起動する。

認識されているか確認する

$ ls /sys/bus/w1/devices
28-0115c11746ff  w1_bus_master1

28-hogehogeがいればOK。

値の簡易確認

$ cat /sys/bus/w1/devices/28-0115c11746ff/w1_slave
80 01 4b 46 7f ff 0c 10 67 : crc=67 YES
80 01 4b 46 7f ff 0c 10 67 t=24000

t=24000が摂氏*1000した温度である。

値の切り出し

こういったファイルから特定位置の値を切り出すには正規表現が楽である。

cat /sys/bus/w1/devices/28-0115c11746ff/w1_slave | grep -o 't=[0-9]*' | grep -o '[0-9]*'

切り出し方はあまり綺麗ではない。もっと簡単にとれそうな感じもあるが・・・。ひとまずこれで値は取得できる。

BitBucket

Boxil / ds18b20_sensor / source / — Bitbucket

ピンの接続

SがValueなのでGPIOの4番に接続する。 -はGNDに接続する。 残りの真ん中が電源で3.3Vに接続する。 間違えると、センサーが高熱になってくさい臭いがし始めるので注意。

ところで、DS18B20でググるとプルアップ抵抗を繋いでいる記事が多いが、内蔵プルアップ抵抗を有効にするのでは駄目なのだろうか?電子工作の知識が足りていないのでよくわからない。

f:id:mczh:20160718185852j:plain