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に引き渡しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @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更新・掲載致します。

