Patlam-Pi Step2

目的

Raspberry Piでsmnptrapを受信し音と光で伝えてくれるパトランプを作成する
今回はハードウェア周りに触れてみます

工程

  1. スピーカの選定
  2. ライトの選定
  3. GPIO制御

全体図

1. スピーカの選定

近所の電器屋で一番安く手に入ったELECOMのUSBスピーカを利用しました
ステレオである必要はないため、もう一方のスピーカへ出ているケーブルを切断し
モノラル化したものを利用しました。

2. ライトの選定

こちらはコンセントに挿しておくと、夜間自動点灯する インテリアライトを改造して使いました

中身の基板を流用したかったため表面実装部品等は全て取り去り LEDを無理やり実装の上、ホットボンドで固定しました。

Raspberry Pi GPIOの電流制限に引っかからないように
IOポート一つに付きLEDを1個駆動します。(計2個)

3. GPIO制御

snmptrapd.conf の設定にて、下記Pythonスクリプトをキックしています。

Step1で編集した設定に追記でアラート受信時に音を鳴らし光るスクリプトを実行するように設定変更

#### When Recieve Trap
#default : write to syslog
#traphandle default /usr/bin/logger /tmp/test.log ## for test logging
traphandle default /prj/Patlam-pi/bin/trap_receive.py

#### Settings
doNotRetainNotificationLogs yes  
doNotLogTraps no  
doNotFork no

# authCommunity   TYPES COMMUNITY   [SOURCE [OID | -v VIEW ]]
authCommunity     log,execute,net   private  
authCommunity     log,execute,net   public

disableAuthorization no  

テスト

$ sudo snmptrap -v 2c -c public [Raspberry PiのIPアドレス] '' .1.3.6.1.4.1.8072.99999 .1.3.6.1.4.1.8072.99999.1 s "Hello World"

処理の中心部分のみ記載しました、詳細はgithubへどうぞ
https://github.com/tktk19/Patlam-pi/blob/master/bin/trap_receive.py

class Alart():  
    def __init__(self):
        # GPIOの設定
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(23, GPIO.OUT)
        GPIO.setup(24, GPIO.OUT)

    def __sound(self):
        # サウンド再生コマンドをバックグラウンドで実行します
        sound_file = os.path.join(patlam_pi.app.config['SOUNDDATA'], "ALARM.WAV")
        cmd = "/usr/bin/aplay " + sound_file + " &"
        os.system(cmd)

    def __light(self):
        __led_blink_count = patlam_pi.get_setting('LEDBlink')
        i = 0
        while i < int(__led_blink_count):
            # LED2つを0.5秒間隔でUI設定回数分点滅させます
            GPIO.output(23, True)
            GPIO.output(24, True)
            time.sleep(0.5)
            GPIO.output(23, False)
            GPIO.output(24, False)
            time.sleep(0.5)
            i+=1

    def fire(self):
        self.__sound()
        self.__light()

if __name__ == '__main__':  
    alart = Alart()
    alart.fire()

ソース

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

SpecialThanks

UI/CSS 嫁 感謝!

takashi