てけとーぶろぐ。

ソフトウェアの開発と、お絵かきと、雑記と。

Pythonで株価アラートをつくる(4)

今回は前回までで作成した株価アラートプログラムをRaspberry Pi上で動かしていきます。

Raspberry Piの用意

Raspberry Piには幾つもモデルがあります。何を選ぶのがいいでしょうか。
最新モデルは Raspberry Pi 4 ですが「Raspberry Pi Raspberry Pi 3 Model B」「Raspberry Pi Raspberry Pi 2 Model B」あたりが価格も落ち着いていておすすめです。

jp.rs-online.com

jp.rs-online.com

性能もそれなりですが今回の用途には問題ないはずです。

Raspberry Pi Zeroは価格も消費電力も魅力的ですが経験上性能が十分ではないので今回の用途にはおすすめできません。

安定稼働のためにイーサネット接続(有線LAN接続)もできたほうがいいのでその点でもRaspberry Pi Zeroは候補から外れます。

アクセサリーの用意

電源
電源はアンペア数が十分なものを選びましょう。以下がおすすめです。

SDカード
容量はひとまず8GBもあれば十分です。あとは、ブランド、値段、読み書きの速度を見て選びます。
読み書きの速度についてはUHSスピードクラス1、SDスピードクラス10で、読み出し20MB/s もあれば十分です。
1,000円もしないと思います。例えば以下がおすすめです。

その他
お使いのルーターイーサネットケーブルの差込口があること、つまりRaspberry Piを有線LAN接続できることをご確認ください。
接続のためのイーサネットケーブルも必要になります。ルーターのすぐそばにRaspberry Piも設置するならば短いものを。
個人的に薄いケーブルが取り回しが良くておすすめです。例えば以下。

ルーターイーサネットケーブルの差込口がなくwifi接続にする場合は「wifi接続にする場合は」を参照してください。

OS(Raspbian)のインストール

Download Raspbian for Raspberry Pi
より「2020-02-13-raspbian-buster-lite.zip」をダウンロードします。
zipファイルを展開してできた「2020-02-13-raspbian-buster-lite.img」をSDカードに書き込みます。

imgファイルのSDカードへの書き込みにはWin32 Disk Imagerを使います。
Win32 Disk Imager download | SourceForge.net
からダウンロード、インストールします。

SDカードをSDカードリーダーにセットし、Win32 Disk Imagerを起動。
Image Fileとして「2020-02-13-raspbian-buster-lite.img」を指定して
Deviceとして書き込み先のSDカードのドライブを指定して「Write」ボタンをクリックします。

SSH接続の許可

Raspberry Piの操作はPCからSSH接続して行います。
Raspberry PiSSH接続ができるように、SSH接続を許可します。

具体的にはimgファイルを書き込んだSDカードのルートディレクトリー内に「ssh」という名前の空のファイルを作成します。

参照: Enable SSH when creating SD card - Raspberry Pi Forums

コマンドプロンプトで行う場合はコマンドプロンプトを開きまずカレントドライブをSDカードのドライブにします。
「D」ドライブであれば以下の通り。

> D:
> cd \

ファイルを確認します。

> dir

「overlays」というディレクトリーなどがあるはずです。
そこで「ssh」という名前の空のファイルを作成します。

> type nul > ssh
有線LAN接続

自宅のルーターRaspberry PiEthernetケーブルで接続します。

(参考)wifiで接続する場合

wifi接続(無線LAN接続)したい場合はRaspberry PiにUSBキーボード、マウス、ディスプレイを接続し、デスクトップPCのようにして設定してしまうのが簡単です。
(Raspberry Pi Raspberry Pi 2 Model B の場合にはUSB無線LANアダプターも必要です。)
その場合OSはGUIで設定するために「Raspbian Buster Lite」ではなく「Raspbian Buster with desktop」を選択します。
Ethernetケーブル接続の代わりに以下のサイトなどを参考にwifiでネットワーク接続します。
【STEP-07】ラズベリーパイを無線LAN(WiFi)でインターネット接続│FABSHOP.JP -デジタルでものづくり! ファブショップ !

一度接続すれば以降起動時に自動接続されるようになります。

Raspberry Piの起動

Raspberry PiにSDカードを挿し、電源ケーブルを接続すれば起動します。
電源スイッチ付きのケーブルの場合は電源スイッチをONにしてください。

SSHログイン

Windows 10 バージョン1803以降であればsshコマンドが使えます。
このsshコマンドを使ってRaspberry PiSSH接続、ログインします。
コマンドプロンプトから以下のコマンドを実行します。

> ssh -l pi raspberrypi.local

「pi」はRaspbian標準のユーザー名、「raspberrypi.local」はRaspbian標準のホスト名です。
「pi@raspberrypi.local's password:」などとユーザー「pi」のパスワードを求められたら「raspberry」と入力します。

ログアウトする場合は

$ exit

シャットダウンするばあいは

$ sudo shutdown -h now

です。

Python 3 のバージョン確認

RaspbianにはPythonがはじめからインストールされています。
ただしpythonコマンドではPython 2が実行されます。
Python 3の実行にはpython3コマンドを使います。
詳細なバージョンを確認してみましょう。

$ python3 --version
Python 3.7.3
pipのインストール

Pythonパッケージのインストールのためにpipをインストールしておきましょう。

$ sudo apt-get update
$ sudo apt-get install python3-pip

pipについてもpip3コマンドを使うことになります。
例えばapschedulerをインストールするのであれば以下のコマンドになります。

$ pip3 install apscheduler
プログラムの配置

コマンドプロンプトからscpコマンドでRaspberry Piにファイルをコピーできます。
カレントディレクトリーにある「stock-price-watcher」ディレクトリー以下を
ホームディレクトリー内にコピーする場合は

> scp -rp stock-price-watcher pi@raspberrypi.local:~/

「-rp」はディレクトリー以下を再帰的にコピーし、コピー元のファイルの更新日時を保ってコピーします。

パッケージのインストール

プログラムの実行にあたって必要なパッケージをインストールします。

$ pip3 install apscheduler
$ pip3 install bs4
$ pip3 install dataclasses_json
環境変数の設定

プログラムの実行にあたって必要な環境変数の設定をします。
例えば環境変数GMAIL_USER」に「hoge@gmail.com」をセットするのであれば以下のコマンドになります。

$ export GMAIL_USER=hoge@gmail.com
Pythonプログラムの実行

実行したいプログラムの*.pyファイルがあるディレクトリーに移動してから
python3コマンドを使ってプログラムを実行します。

$ cd ~/stock-price-watcher
$ python3 main_multiple_code.py

Ctrl + C キーでプログラムを停止します。

Pythonプログラムのバックグラウンド実行

上記の方法で実行した場合ログアウトとすると
プログラムの実行が終了してしまいます。
ログアウトしても終了しないようにするためにはバックグラウンド実行をする必要があります。
具体的には以下のコマンドでバックグラウンド実行します。

$ nohup python3 main_multiple_code.py &

バックグラウンド実行したプログラムを停止する場合は
まず以下のコマンドでプロセスの一覧を表示して
停止したいプロセスのプロセス番号を確認します。

$ ps -fu pi

プロセスのプロセスID(PID)がわかったら
それを使ってkillコマンドでプログラムを停止します。
例えばPIDが17870であれば以下のコマンドで停止します。

$ kill 17870


これでRaspberry Pi上でPythonプログラムを実行することができるようになりました。
次回から本題のビットコインに入っていきたいと思います。