Raspberry Piでパトランプを作成⑤
過去の記事は下記となります。
Raspberry Piでパトランプを作成①
Raspberry Piでパトランプを作成②
Raspberry Piでパトランプを作成③
Raspberry Piでパトランプを作成④
求める仕様
- アラートを音と光で伝えてくれる
- snmptrapを受信
- 安定稼働
- 自前のコンパネにて設定変更が可能 <- 今回はこちら
かっこいいコンパネを作成したい!
言語選定
Linuxが動作しているので、選び放題ですが
Raspberry Piの「Pi」はPythonから来ているとの事で
初めて触る言語でしたが、社内の "えんじにあん師"
より使いやすい、ライブラリが少なくても動くよ
という前情報があったため、チャレンジしてみました。
当初はrubyで行こうと思っておりましたが
gem地獄に落ちたりして、ruby嫌いなのです、、、
選定したフレームワーク/テンプレートエンジン
比較的大きな、DBありき、学習ありきなFrameworkに疲れていたため
microframework な Flaskを選定しました。
Pythonの新しいバージョンに対応していた事と
公式ドキュメントが多く丁寧なチュートリアルも用意されていたため選定しました。
テンプレートエンジンは自ずとJinja2を選択。
結論から言うと大当たりで
Symfony2とTwigをここ数年触っていたので
Twigライクな Jinja2 と IntelliJ IDEAの
強力な補完機能のおかげで、本当に楽しくコーディングできました。
通常フレームワークの routing や config周りで
別ファイルを渡り歩く事もないため、小規模プロジェクト
であれば、開発速度がかなり上がると感じました。
orm を利用していない事の加え、入力値をそのままSQLに埋め込んでおり
インジェクションし放題なはずかしい仕様なので、VerUPを実施していきます。
実装する画面イメージを想定
ログイン可能な設定画面を作る事にしました。
実装する処理は下記です。
- ログイン画面
- 設定画面
-- (アラート用WAVファイル変更機能)今回未実装
-- アラート音量変更機能
-- LED点滅回数変更
-- ステータス表示 (snmptrap受信ログ確認)
ログイン画面
Flaskのセッション機能を利用する事でとても簡単に
ログイン画面機能を実装できました。
下記を参考に実施して行くことでログイン画面を
有するアプリケーションのひな形が簡単に出来上がります。
http://flask.pocoo.org/docs/quickstart/
設定画面
ログイン状態に関わらず settings テーブルの中身を表示するために取得
及びRaspberry Pi上の状態・ログを収集して statuses として viewに引き渡しています。
def __get_system_stat(): statuses = dict() statuses['IP'] = __system("hostname -I") statuses['Uptime'] = __system("w | head -1") statuses['Snmptrap'] = __system("grep 'snmptrapd' /var/log/daemon.log | tail -5").replace('\n','<br>') return statuses @app.route('/') def top(): db = get_db() cur = db.execute('select * from settings') settings = cur.fetchall() statuses = __get_system_stat() return render_template("top.html", settings=settings, statuses=statuses)
データ更新は [URL]/settings にPOSTで引き渡された値を元にDBをUpdateしています。
@app.route('/settings', methods=["POST"]) def settings(): if request.method == 'POST': try: if (not request.form['Volume'].isdigit()): msg = "Volume must be integer" raise ValueError if (not request.form['LEDBlink'].isdigit()): msg = "LEDBlink must be integer" raise ValueError set_setting('Volume', request.form['Volume']) set_setting('LEDBlink', request.form['LEDBlink']) except ValueError: flash(msg) return redirect(url_for('top'))
templates ディレクトリ下のテンプレートで共通で使いたい部分は layout とし
CSS/画像は static ディレクトリに配置しましょう。
ソース
作成したプログラム及び、Raspberry Piの配線図、Raspbianへ実施した設定は下記を参照下さい。
https://github.com/tktk19/Patlam-pi
ムービー
8/25更新・掲載致します。