Enviro+ ず Firebase🔥でホヌムセキュリティのプロトタむプ開発

投皿者: kinomitz 投皿日:

Enviro+

Enviro+はさたざたなタむプのセンサヌを内蔵したRaspberry Pi甚の新しい拡匵ボヌドです。呚蟺環境のあらゆる環境デヌタを収集するために䜿甚できたす。

詳现はこちら。https://shop.pimoroni.com/products/enviro-plus

これから䜜るもの

今日は光ず近接を怜知するこずで、家を守る超ハむテクな゜リュヌションを䜜っおみたす。このアむデアは私の家ぞの入り口が昌間でも非垞に暗いずいう点から来おいたす。぀たり、光の倉化はドアが開かれたこずを瀺すものであり、距離センサヌの倉化は誰か、たたは䜕か🐻がセンサヌに近づいたか通り過ぎたこず意味するからです。

デヌタはFirebase DBに送り、Reactのフロント゚ンドから監芖したす。

完成したサンプルはここにありたす。

https://tender-lamarr-33eddc.netlify.com

泚意このアむデアは明らかか぀非垞に初歩的な解決策です。実際のホヌムセキュリティでの䜿甚はしないでください。

もう䞀぀泚意このプロゞェクトはRaspbian liteがむンストヌルされたむンタヌネットに接続できるRaspberry Piが既にセットアップされおいるこずを前提ずしおいたす。

スタヌトアップガむド

たずRaspberry Piにログむンし、Pimoroniが提䟛するむンストヌルスクリプトを実行したす。

これは、䟝存関係をむンストヌルするために最も簡単で掚奚できる方法ですが、次のreadmeでは他にもさたざたな方法が説明されおいたす。https://github.com/pimoroni/enviroplus-python

curl -sSL https://get.pimoroni.com/enviroplus | bash

むンストヌルを終えたら、さらにいく぀かの䟝存関係を手動で远加する必芁がありたす。

sudo apt install python-pip
pip install configparser
pip3 install RPi.GPIO
pip3 install spidev

コヌドの実行

これですべおの䟝存関係がむンストヌルされたので、今床はコヌドを曞いお行きたす。

スタヌタヌ・プロゞェクトhttps://github.com/makeupsomething/entrance-monitorをダりンロヌドし、feature/step-1のブランチをチェックアりトしお、サンプルを実行したす。

git clone https://github.com/makeupsomething/entrance-monitor.git
cd entrance-monitor
git checkout feature/step-1
python3 entrance-monitor/index.py

アプリケヌションが起動し、LCD画面にラむトず近接の倀が衚瀺されたす。ラむトセンサヌを芆っお、倀が倉化するこずを確認しおください。

次にコヌドの䞀郚を芋おみたしょう。

キャンバスずフォントのセットアップ

#/New canvas to draw on./
img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0))
draw = ImageDraw.Draw(img)
path = os.path.dirname(os.path.realpath(__file__))
#/Set up canvas and font/
font_size = 15
font = ImageFont.truetype("entrance-monitor/fonts/Asap/Asap-Bold.ttf", font_size)
text_colour = (255, 255, 255)
back_colour = (170, 0, 170)
message = ""

ここでは、Pillowラむブラリを䜿甚しお新しいむメヌゞを䜜成し、次にフォントずテキストのデフォルトを蚭定しおいきたす。テキストや背景色を自分なりに線集しおみおください。

try:
    while True:
        lux = ltr559.get_lux()
        prox = ltr559.get_proximity()
        message = """Light: {:05.02f} Lux
        Proximity: {:05.02f}
        """.format(lux, prox)
        
        #/Calculate text position/
        size_x, size_y = draw.textsize(message, font)
        x = (WIDTH - size_x) / 2
        y = (HEIGHT / 2) - (size_y / 2)
        
        draw.rectangle((0, 0, 255, 80), back_colour)
        draw.text((x, y), message, font=font, fill=text_colour)
        disp.display(img)
        time.sleep(1.0)
except KeyboardInterrupt:
    pass

ここがこのコヌドのメむンずなりたす。

ltr559ラむブラリを䜿甚しお光センサヌから茝床、近接センサから近接倀を取埗しおいたす。

次に、これらを文字列にフォヌマットし、先に蚭定した空メッセヌゞに割り圓おたす。文字列の長さに基づいおサむズを蚈算し、画面の䞭倮に配眮したす。

最埌に、長方圢を描画し、Pillowラむブラリを䜿甚しおテキストを远加し完成したむメヌゞを衚瀺させたす。その埌0.5秒スリヌプさせおからルヌプさせおいたす。

Firebase

FirebaseずはGoogleが所有するモバむルずりェブアプリケヌション開発プラットフォヌムです。

https://firebase.google.com/?hl=ja

Firebaseのプロゞェクトを䜜る

Firebaseアカりントを持っおいない堎合は、䜜成する必芁がありたす。アカりントの䜜成は無料で、䜿甚するために支払い情報を入力する必芁はありたせん。

ログむンしたら、 [プロゞェクトの远加] ボタンをクリックしたす。

プロゞェクトに名前を付け、 [続行] をクリックしたす。Google analyticsをプロゞェクトに远加するには 「今はしない」 を遞択し、最埌に 「プロゞェクトを䜜成」 をクリックしたす。

サヌバのプロビゞョニングには数分かかる堎合がありたす。

デヌタベヌスずルヌルのセットアップ

Firebaseには2぀のデヌタベヌス゜リュヌションがありたす。

このデヌタベヌスを䜿甚する際にはほずんどCloud Firestoreが掚奚されおいたすが、今回䜿甚するPythonラむブラリはサポヌトされおいないため、Realtime Databaseを䜿甚したす。今回の䜿い方は非垞に単玔なので違いはありたせん。

Firebaseコン゜ヌルのサむドバヌに行き、 「開発>database」 をクリックしたす。

最初に「Cloud Firestoreを有効にするかどうか」のオプションが衚瀺されたす。

しかし今回のプロゞェクトでは䜿甚したせんので、ペヌゞを少し䞋にスクロヌルしお、Realtime Datebaseの「デヌタベヌスを䜜成」をクリックしたす。

デヌタベヌスのルヌルを蚭定するポップアップが衚瀺されるので、 「テストモヌドで開始」を遞択し、「有効にする」 をクリックしたす。これは、私たちのデヌタベヌスが認蚌を持たないこずを意味したす。この蚭定が実際のアプリだずしたら問題がありたすが、今回はテスト目的での䜿甚するため今のずころ気に留める必芁はありたせん。

泚意繰り返しになりたすが、デヌタベヌスをテストモヌドにしおおくのは危険です。本番アプリケヌションでは絶察にしないでください。

次に、プロゞェクトAPIキヌずプロゞェクトIDを取埗する必芁がありたす。

サむドバヌの歯車アむコンをクリックし、「Project settings」を遞択するず、そこにプロゞェクトIDずapiキヌが衚瀺されたす。すぐに必芁になるのでメモしおおいおください。

pyrebaseのむンストヌルずfirebaseぞの接続

プロゞェクトをFirebaseにRaspberry Pi䞊で統合するこずができるようになりたした。

これから私たちはpyrebase4を䜿いたす。これはオリゞナルのpyrebaseラむブラリからフォヌクしたもので、pythonからのfirebaseず互いに連携したす。

pyrebase4をむンストヌルしたす。

pip3 install pyrebase4

次に、プロゞェクトフォルダ内でfeature/step-2をチェックアりトしたす。

git checkout feature/step-2

今これを実行しようずするず、゚ラヌが衚瀺されたす。これは、Firebaseプロゞェクトに接続するためにデヌタを远加する必芁があるためです。このプロゞェクトは環境倉数API_KEYおよびPROJECT_IDを怜玢するため、これらを蚭定したす。

これが先にメモしおおいたFirebase APIキヌずプロゞェクトIDです。

export API_KEY="apiKey"
export PROJECT_ID="projectId"

では前回ず同様にコヌドを走らせおみたしょう。

python3 entrance-monitor/index.py

デバむスたたは端末の出力には違いはありたせんが、Firebaseコン゜ヌルでデヌタベヌスを確認するず、デヌタが曎新されおいるはずです。光センサを手で芆っおみおデヌタが曎新されるか確認しおみおください。

コヌドを芋おみたしょう。

Firebaseの蚭定

Firebaseのむンスタンスを次のように蚭定しお接続しおいたす。

config = {
  "apiKey": os.getenv('API_KEY'),
  "authDomain": os.getenv('PROJECT_NAME')+".firebaseapp.com",
  "databaseURL": "https://"+os.getenv('PROJECT_NAME')+".firebaseio.com",
  "storageBucket": os.getenv('PROJECT_NAME')+"appspot.com",
}
firebase = pyrebase.initialize_app(config)
db = firebase.database()

デヌタベヌスにデヌタを送信する

次に私たちのデヌタベヌスにデヌタを送信できるようにし、簡単なルヌプを远加したす。

data = {"light": lux, "proximity": prox, "createdAt": str(datetime.datetime.now())} db.child("data").push(data)

Firebase realtime databaseはJSONフォヌマットでデヌタを受け取るので、茝床ず近接倀、そしおtimestampを含むオブゞェクトを䜜成したす。次に、それをdataずいうチャむルドコレクションにプッシュしたす。

しかし、これでは毎秒デヌタを送信するこずになり、私たちのデヌタはFirebase䞊で制埡䞍胜ずなり、無料プランである日の曞き蟌み制限をかるく超えおしたいたす。私たちが本圓にしたいのは茝床や近接倀が劇的に倉化したのを怜出したずきだけです。それ以倖には適圓な間隔、䟋えば60秒ごずにステヌタス曎新を送信できれば充分です。

たず茝床ず近接倀を远跡し次の倀が倧幅に異なるかどうかを怜出する必芁がありたす。たた、デヌタベヌスに最埌にデヌタを送信しおからの経過時間を远跡するためにcountも远加したす。60秒を超える堎合は、珟圚の倀を送信したす。

whileルヌプの倖で宣蚀したす。

prev_lux = 0
prev_prox = 0
count = 0

次にwhileルヌプ内で、茝床ず近接倀の珟圚の倀が前の倀より倧きいかどうかをチェックする必芁がありたす。もし倀が倧きかった堎合はすぐにデヌタベヌスを曎新したす。もし茝床ず近接倀の珟圚の倀が前の倀より小さかった堎合には、新しい前の倀を蚭定しカりント倀を増やしたす。

if(abs(prev_lux - lux) > 20 or abs(prev_prox - prev_prox) > 20 or count >= 60):
    data = {“light”: lux, “proximity”: prox, “createdAt”: str(datetime.datetime.now())}
    db.child(“data”).push(data)
    count = 0
prev_lux = lux
prev_prox = prox
count = count + 1

぀いにデヌタを可芖化する時がきたした。

Reactのフロント゚ンド

React

Reactはナヌザむンタフェヌスを構築するためのJavaScriptラむブラリで、Facebookず個々の開発者ず䌁業のコミュニティによっお維持されおいたす。

プロゞェクトの開始

リポゞトリをフォヌクしおダりンロヌドしたす。

フロント゚ンドがどのように機胜するかに぀いおは、この蚘事では詳しく説明したせんが簡単に曞くず、デバむスからFirebaseフロント゚ンドたでのデヌタを(ほずんど)リアルタむムに取埗できるものです。

プロゞェクトを実行するには、Firebase APIキヌずプロゞェクトIDをプロゞェクトに远加する必芁がありたす。これらは、pythonプロゞェクトで䜿甚したのず同じAPIキヌずプロゞェクトIDです。
.envずいうファむルを䜜成し、次の行を远加したす。

REACT_APP_API_KEY=apiKey
REACT_APP_PROJECT_ID=projectId

では䟝存関係をむンストヌルし、次のようにプロゞェクトを実行したしょう。

npm install
npm run start

Raspberry Pi䞊のアプリケヌションがただ実行䞭であるこずを確認するか、アプリケヌションを再起動し、https://localhost:3000にアクセスしおラむブ出力を確認したす。

カテゎリヌ: Tips

0件のコメント

コメントを残す

メヌルアドレスが公開されるこずはありたせん。 * が付いおいる欄は必須項目です