Raspberry Piでパトランプを作成⑤

Raspberry Piでパトランプを作成⑤

過去の記事は下記となります。
Raspberry Piでパトランプを作成①
Raspberry Piでパトランプを作成②
Raspberry Piでパトランプを作成③
Raspberry Piでパトランプを作成④

求める仕様

かっこいいコンパネを作成したい!

言語選定

Linuxが動作しているので、選び放題ですが
Raspberry Piの「Pi」はPythonから来ているとの事で
初めて触る言語でしたが、社内の "えんじにあん師"
より使いやすい、ライブラリが少なくても動くよ
という前情報があったため、チャレンジしてみました。

当初はrubyで行こうと思っておりましたが
gem地獄に落ちたりして、ruby嫌いなのです、、、

選定したフレームワーク/テンプレートエンジン

flask

比較的大きな、DBありき、学習ありきなFrameworkに疲れていたため
microframework な Flaskを選定しました。

Pythonの新しいバージョンに対応していた事と
公式ドキュメントが多く丁寧なチュートリアルも用意されていたため選定しました。
テンプレートエンジンは自ずとJinja2を選択。

結論から言うと大当たりで
Symfony2とTwigをここ数年触っていたので
Twigライクな Jinja2 と IntelliJ IDEAの
強力な補完機能のおかげで、本当に楽しくコーディングできました。

通常フレームワークの routing や config周りで
別ファイルを渡り歩く事もないため、小規模プロジェクト
であれば、開発速度がかなり上がると感じました。

orm を利用していない事の加え、入力値をそのままSQLに埋め込んでおり
インジェクションし放題なはずかしい仕様なので、VerUPを実施していきます。

実装する画面イメージを想定

ログイン可能な設定画面を作る事にしました。
実装する処理は下記です。

  • ログイン画面
  • 設定画面
    -- (アラート用WAVファイル変更機能)今回未実装
    -- アラート音量変更機能
    -- LED点滅回数変更
    -- ステータス表示 (snmptrap受信ログ確認)

ログイン画面

02.Login

Flaskのセッション機能を利用する事でとても簡単に
ログイン画面機能を実装できました。

下記を参考に実施して行くことでログイン画面を
有するアプリケーションのひな形が簡単に出来上がります。
http://flask.pocoo.org/docs/quickstart/

設定画面

03.Settings

ログイン状態に関わらず settings テーブルの中身を表示するために取得
及びRaspberry Pi上の状態・ログを収集して statuses として viewに引き渡しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def <strong>get_system_stat():
statuses = dict()
statuses['IP'] = </strong>system(&quot;hostname -I&quot;)
statuses['Uptime'] = <strong>system(&quot;w | head -1&quot;)
statuses['Snmptrap'] = </strong>system(&quot;grep 'snmptrapd' /var/log/daemon.log | tail -5&quot;).replace('\n','&lt;br&gt;')</p>
[crayon-690221845c7be728751375/]
<p>@app.route('/')
def top():
db = get_db()
cur = db.execute('select * from settings')
settings = cur.fetchall()
statuses = __get_system_stat()</p>
[crayon-690221845c7c3163248730/]
<p>

データ更新は [URL]/settings にPOSTで引き渡された値を元にDBをUpdateしています。

1
2
3
4
5
6
7
8
9
@app.route('/settings', methods=[&quot;POST&quot;])
def settings():
if request.method == 'POST':
try:
if (not request.form['Volume'].isdigit()):
msg = &quot;Volume must be integer&quot;
raise ValueError</p>
[crayon-690221845c7c5836399281/]
<p>

templates ディレクトリ下のテンプレートで共通で使いたい部分は layout とし
CSS/画像は static ディレクトリに配置しましょう。

ソース

作成したプログラム及び、Raspberry Piの配線図、Raspbianへ実施した設定は下記を参照下さい。
https://github.com/tktk19/Patlam-pi

ムービー

8/25更新・掲載致します。
参考動画

flask Raspi_Colour_R-207x250

投稿者プロフィール

takashi
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


Time limit is exhausted. Please reload CAPTCHA.