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に引き渡しています。

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更新・掲載致します。

flask Raspi_Colour_R-207x250

投稿者プロフィール

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

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

コメントを残す

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

CAPTCHA


Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

Japan AWS Ambassadors 2023, 2024 開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。