2020/05/04 自作アラート(Zabbix) 2 ~物理アラート作成~
前の記事
今回の目的は物理的アラートで通知すること。
本当はパトランプのようなもので「emergency!!emergency!!」という音とともにピカピカさせたかった。
パトランプは高かったので諦め、LEDテープを部屋の全体に張りピカピカさせることも考えたがそれも高かった。
それも諦めた。
どうしたものかと考え、仕方が無いので小さいもので家にあるもの。
LEDとブザー。これらで作ってみようという結論に。
メモ
ZabbixでLEDと音で通知したい。
LEDと音をどうするの問題。
ラズパイでLEDとブザーを制御
Python GPIO
LEDは4色を障害レベルによって分ける。赤緑黄白
ブザー音も障害レベルによって分ける。(パターンで分ける)
アラートとLED
まずは、アラート音とLEDを動かす方法を考える。
とはいえ、前もやったGPIOが一番楽。
なので早速トライ。
持っているLEDは4色。赤、黄、白、緑
緑は障害復旧色にすることにして、その他の色は障害レベルによって分けることにした。
赤>黄>白 緑(復旧)
これでいく。
次にブザー音。
音でも違いがわかるようにする。
赤:ピーーー、ピーーーー
黄:ピピピーー、ピピピーー
白:ピピッ、ピピッ
緑:ピッ、ピッ(点滅)
これに決めた。
まずは、ラズパイとパーツをそれぞれ接続。
https://gyazo.com/20e4c5f06e9a01411429c7dd51eac999
上のは結構適当。というのも知識がない。
ラズパイのGPIOは3.3V
LEDのVfが2.0V, Ifが20mA
よって、最低でも65Ωの抵抗が必要になる
ラズパイはすべてのピンで合計50mAを超えてはだめという話を聞いたので、
一つのLEDに対して余裕をもたせて6mAくらい流すことにする。
200Ωくらいにすればいい。
ブザーの動作電圧は4Vだったが音はなったので問題なし。
定格電圧を超えなければ安全なんだと思われる。
あとはとても単純。GPIOをそれぞれOUTで利用する。
配線が決まったらコーディング
ここで一つ問題が、LEDとブザーを同時にtimeで制御すると音とLEDが同じタイミングで動いてしまう。
どうしたものかと調べていると「threading」というモジュールがあるということがわかった。
これは並列処理ができるようになるらしい。
早速実装してみる。
code:python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import sys
import logging
import threading //threading読み込み
Buzzer_Num = 26
if color == "red":
GPIO_Num = 17
elif color == "yellow":
GPIO_Num = 27
elif color == "white":
GPIO_Num = 20
else:
GPIO_Num = 21
def on_led():
if color == "green":
for x in xrange(3):
GPIO.output(GPIO_Num,True)
time.sleep(1)
GPIO.output(GPIO_Num,False)
time.sleep(1)
else:
GPIO.output(GPIO_Num,True)
time.sleep(6)
GPIO.output(GPIO_Num,False)
time.sleep(1)
def on_buzzer():
if color == "red":
for x in xrange(6):
GPIO.output(Buzzer_Num,True)
time.sleep(0.8)
GPIO.output(Buzzer_Num,False)
time.sleep(0.2)
elif color == "yellow":
for x in xrange(3):
GPIO.output(Buzzer_Num,True)
time.sleep(0.1)
GPIO.output(Buzzer_Num,False)
time.sleep(0.1)
GPIO.output(Buzzer_Num,True)
time.sleep(0.1)
GPIO.output(Buzzer_Num,False)
time.sleep(0.1)
GPIO.output(Buzzer_Num,True)
time.sleep(0.2)
GPIO.output(Buzzer_Num,False)
time.sleep(1.2)
if color == "white":
for x in xrange(3):
GPIO.output(Buzzer_Num,True)
time.sleep(0.1)
GPIO.output(Buzzer_Num,False)
time.sleep(0.1)
GPIO.output(Buzzer_Num,True)
time.sleep(0.1)
GPIO.output(Buzzer_Num,False)
time.sleep(1.7)
if color == "green":
for x in xrange(5):
GPIO.output(Buzzer_Num,True)
time.sleep(0.1)
GPIO.output(Buzzer_Num,False)
time.sleep(0.9)
if __name__ == "__main__":
GPIO.setmode(GPIO.BCM)
thread1 = threading.Thread(target = on_led)
thread2 = threading.Thread(target = on_buzzer)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
GPIO.cleanup()
color = sys.argv{1}
これは引数をcolorに入れる処理。
thread1 = threading.Thread(target = on_led)
thread2 = threading.Thread(target = on_buzzer)
ここで2つのスレッドに分ける。
targetにはdefを入れておく。
startで処理を開始。
joinは処理が終わるまで待ち状態にするために入力。
これでプログラムは完成。
引数をred, yellow , white, greenのどれかを入れて実行すると
python hogehoge.py yellow
上のコードが実行される
https://gyazo.com/b0862aca418174c5b10f78089489c598
実際に実行してみた結果がこれ
無事に動いている。
Zabbixと連携
目的はZabbixのアラートとしてLEDを利用することなのでその設定を行う。
上記のプログラムを書いたラズパイではないマシンがZabbixサーバなので
SSHでリモートコマンドを実行することにした。
セキュリティの観点から現在利用しているユーザでログインするのは良くないので、
ラズパイでZabbixのリモートコマンド用ユーザを追加する。
adduser <新ユーザ>
passwd <新ユーザ>
GPIOモジュールが利用できるように、グループに追加する。
# gpasswd -a <新ユーザ> gpio
トリガーとしては前の記事で設定してあるので、
次はアクションの設定
設定タブのアクションを選択し、アクションの作成
実行内容タブから実行内容の追加。
リモートコマンドを選択して、タイプSSH
https://gyazo.com/192e05e93116f1523af8d3cc06d65a7a
それぞれ入力していく。
ここには先程追加したユーザを追加。
SSHでアクセスできるように設定も忘れずに。
復旧時の実行内容にも実行内容を追加。
具体的には、
python /home/<ユーザ>/hogehoge/hoge.py green
これを実行させる。
これらの設定を入れることで、物理アラートが完成だ。
次はむき出しのままだと見た目が悪いのでケースを作成。
詳細はモデリングページ
ハンダ付けを行い、
https://gyazo.com/458d6715505f3cbfbd6c1a85edd3d333
完成した結果がこちら
https://gyazo.com/7fc376aaebe1d1fa0d597a01e8b6fb09
動作デモ
https://youtu.be/g7rC06m1r4E