今週は皆様にお知らせがあります。私たちは独立性を守るため、一切の広告を掲載致しません。一日平均約¥1500の食費で生活しております。 私たちにも、サーバー、プログラム、焼酎など、世界でトップクラスのウェブサイト同様のコストがかかります。 利用者は何百人もいますが、他の大きなサイトに比べほんの少額の費用で運営しているのです。 今日、読者の皆様が¥10ご援助下されば、この募集はARIA The NATURAL 2.30769周分の時間で終了します。

※1 これはWikipedia乞食のジョークです
※2 Wikipediaとは異なり技術力があるので寄付しないをクリックすると二度と表示されません
Kaleidoscope, its fuck'n beautiful.

これが IoT もどきだ!


社内 LT のネタにしたのでブログにも載せておきます。

使ったもの

秋月とか行かなくても全部 Amazon で買えます。
以下 Amazon リンク。

必要なもの

無くてもいいけど有ったほうがいいもの

技術的な解説

回路

上記のパーツで組む場合は回路図よりも写真の方が正確です。

ものすごく適当です。
赤外線受光モジュールの出力が怪しかったので 300Ω の抵抗を挟んだ程度です。
また、 GPIO の 3.3V 出力では赤外線 LED を十分に発光できないので、本来は 100Ω 程度必要なはずの抵抗を取り払っています。

赤外線パターンの登録

$ mode2 -d /dev/lirc0 > button1
$ mode2 -d /dev/lirc0 > button2
$ mode2 -d /dev/lirc0 > button3

などと繰り返して登録しますが、パターンファイルの最初の行は受信開始までの時間なので、除外しないといけないです。
面倒なので、 Python でいい感じにいい感じしてくれるスクリプトを書きました。

mode2 -d /dev/lirc0 | format.py > [パターンファイル名] (^C) で動きます。

lircd.conf の生成

begin remote
    name aircon
    flags RAW_CODES
    eps 30
    aeps 100
    gap 200000
    toggle_bit_mask 0x0

        begin raw_codes

            name button1
            3506 1713 464 406 464 1277 461 408
            464 406 461 409 465 406 462 406
            463 409 460 407 466 405 465 405 ...

            name button2
            3533 1709 462 410 461 1277 464 406
            465 405 462 408 464 405 469 402
            461 409 461 410 462 407 461 408 ...

        end raw_codes
end remote

のようなフォーマットの設定ファイルを吐き出す必要があります(インデントは不要)。
これも面倒なので、 Python でいい感じにいい感じしてくれるスクリプトを書きました。

generate.py [機器名] [設定ファイル名] [パターンファイル1 パターンファイル2 パターンファイル3 ...] で動きます。

Web アプリの作成

Raspberry Pi は非力なのでサーバーサイドで完結するのは避けたいです。
Raspberry Pi には JSON を返す API を作って別のサーバーの Web クライアントから操作させます。

サーバーサイド(Raspberry Pi)

Python のみで実装しています。
ユーザー情報の格納に使うバックエンドはフラットなファイルです。

爆速マイクロフレームワークの Bottle でいい感じにルーティングして、 Python 標準の JSON エンコーダーを使用しています。

パスワードはストレッチングこそしてるものの、ソルトを付加していないです。
一応そのまま使っても大丈夫だとは思いますが、シュッとそれっぽいものを書いただけなので、適当な認証ライブラリを噛ませた方がいいです。
仮にそのまま使う場合は、必ず HTTPS で暗号化するべきです。
また、そもそも認証方法にかかわらず最初から強固なパスワードを使用するべきです。

API のエンドポイントは @route() を見れば自明なので省略。

クライアントサイド

zepto.jsjsSHA でパパッと実装して終わり。
ただ、 API が返す情報が足りないことを、後になってから気づいたので、大変なことになっています。

スマホ前提に作っているので、デスクトップの横に広い画面で見ると崩れます。

おわりに

帰ったら家が激冷えなの、控えめに言って最高。