Raspberry Π

Raspberry Piでいろんなことをやってみようというブログです。

mincraft

7セグメントLEDを使ってwebページの値を表示する

7セグメントLEDを使いwebページの値を取ってきて、常時表示するようにしたいと思いました。
ということで、
そのような機能をRaspberry Piに追加してみます。

f:id:taka230035:20161010093934j:plain:w300



具体的な機能

自分はあるwebページから商品を購入したいと思っているのですが、
そのページのある商品はよく、
在庫なし
となるのです。
それで、常時チェックして、その在庫数を7セグメントLEDに表示させるような機能を制作します。

これにより、気になるときにいちいちwebページを覗く必要がなり、気が散らなくなります!!!!

ちなみにwebページというのはこちら

ホビーショップ デジラ
そう、普段よりRaspberry Piの囲いとして、レゴ・パーツを使っているのですが、
単色で統一したいと思いまして。
ある色のブロックをまとめ買いしたいということです。

Webページについてですが、 各パーツの詳細に行くと、そのパーツの在庫数とか値段が表示されます。
f:id:taka230035:20161010093954p:plain:w200
上記のアイテムも在庫数が0
この在庫数の数字、今回だと"0"という値を取ってきて、LEDに表示させようと思います。

今回はRaspberry Piというより、どちらかというとpython側の設定です。




使ったものとか条件とか

前回の

rasp0035.hatenablog.com

の作業を終えて、pythonよりLEDの表示操作が出来るようになっていることが前提です。
配線も上記そのままとします。
あと、OSのcron設定の知識があることです。
部品等は追加で必要ありません。





スクリプト

スクリプトは以下としました。
※コピー&ペースト環境によっては
 エラーとなることがあります。

import urllib2
import BeautifulSoup
import wiringpi as pi, time

if __name__ == "__main__":
url = "https://www.dgla.jp/shop/index.php?xxxxxxx"#①

htmldata = urllib2.urlopen(url)
opener = urllib2.build_opener()
soup = BeautifulSoup.BeautifulSoup(urllib2.urlopen(url).read())

count = 0#②
string = ""
for li in soup.findAll("li"):
if count == 13:
string = li.string
count = count + 1

number = int(string[0:1])

d0_pin = 18#③
d1_pin = 23
d2_pin = 24
d3_pin = 25

pi.wiringPiSetupGpio()
pi.pinMode( d0_pin, 1)
pi.pinMode( d1_pin, 1)
pi.pinMode( d2_pin, 1)
pi.pinMode( d3_pin, 1)

pi.digitalWrite( d0_pin, number & 0x01 )#④
pi.digitalWrite( d1_pin, number & 0x02 )
pi.digitalWrite( d2_pin, number & 0x04 )
pi.digitalWrite( d3_pin, number & 0x08 )

htmldata.close()





スクリプト解説

独学による解説です。

①今回の在庫数が欲しいページのURLを設定します。
 自分が狙っているものがバレてしまうので、xxxxxxxとさせていただいてます 笑
 また、この下の3行ほどで、対象ページのソースを丸々取得する処理を行ってます。


②countについては
 在庫数は liタグ で句切られているので、
 ソース全体の初めから 在庫数が所属しているliタグまでをカウントしています。
 在庫数所属のliタグは13個目なので、その判定用です。
 またstringについては
 実際にLEDに表示する値を含んだ文字です。在庫数が掲載されている一覧の文字列です。(「”数字” 在庫数」とstringに格納されるので、このあと”数字”のみを抜き出す。)

number = int(string[0:1])

にてstringの先頭1文字を抜き出して、在庫数を取得しています。


③この辺りは前回から変更なしでデフォルトです。


④numberは実際に表示させたい数値となります。
 それを2進数に直して、LEDに表示させる処理を行っています。

解説としては以上。



cron設定

次にcron設定で上記スクリプト自動起動させます。
pythonが実行できるユーザになってください。

python XXXX.py


実行時にsudoとかしている場合は、

su -

で管理者になって、cron設定をする必要があると思います。
次に
cron設定を確認します。

cron -l


そして、cron設定を行います
コマンド打ち間違いに気をつけてください。
※スペル間違うとcron設定がイッパツで消える可能性あります。
 事前にcron -lで確認してるので、再設定するだけです。

cron -e



最後に、
自分は1時間に1回スクリプトを起動し、サイトをチェックする仕様にしました。

0 * * * * python xxxxxxx.py


xxxxxxx.pyはフルパスで記載してください。

とくにcronサービスの再起動は要らないかと思います。




動作

スクリプトをエラーなく実行した結果が以下です。
f:id:taka230035:20161010093934j:plain:w200
この日は在庫数が3つしかありませんでした。
送料のほうが断然たかくなるので、購入は控えました。




課題というかオチというか

すでにご覧の方々は気付いているかもしれませんが、
今回はLEDを1つだけ使いました。1つしか持っていないのですが。
となると、1桁しか表示できません。
在庫数が1でも10でも100でも
LEDには 1 と表示されます。

結局。。
LEDに3が表示されていた場合、300追加されている可能性もあり、
気になってWebページを見てしまいます。

ただ、0だった値が数字が増えている場合は
売り切れでなく、品物が補填されたということで、
売り切れかどうかの判断は今回の仕様で十分かと思います。


あとはwebサイトのレイアウトが変わった場合、
スクリプトも同時に修正する必要があり、管理作業が入ってきます。


さらに今回はcronで1時間に1回webサイトにアクセスしてますが、
アクセス頻度が多いと、商品のサーバ管理者にプログラミングでの自動でのアクセスがバレて、
不正アクセスとされ、アクセス禁止となる可能性もあります。
これも1時間に1回とかであれば、平気だと思うのですが。


で、最後に
このデジラというショッピングサイトですが、
そもそも扱っているレゴパーツの在庫数が少ないようです。種類は多そうですが。

1ヶ月ほど監視してましたが、
自分が欲しい商品は数十〜数百まとめて欲しいのですが、
在庫数が10以上になることがほとんでありません。
自分が欲しいパーツだけなのかも!?

これじゃあ、他のサイトの方が良いかもと思ってたところで、在庫数が数百ある他サイトを発見してしまい。
そこで買ったほうがイイというオチでした。

以上です。