BME280 で取得した室温を zabbix_sender で Zabbix サーバーに送る

昨日、センサーモジュールから値を取得するスクリプトを一般ユーザーで実行できるようにしたので、取得した値を Zabbix サーバーに投げることにしました。

使うのは Zabbix サーバーにデータを投げる zabbix_sender です。

zabbix_sender のインストール

公式サイトから 3.0.3 のソースをダウンロードして展開します。

$ tar zxvf zabbix-3.0.3.tar.gz
$ cd zabbix-3.0.3/

--enable-agent を付けてコンフィグファイルを作ってから make します。

$ ./configure --enable-agent
$ make
$ sudo make install

Zabbix サーバーの設定

Zabbix サーバーのフロントエンドにアクセスして、設定ホスト%対象のホスト%アイテムとたどってアイテムの作成をクリック。

f:id:k-side:20160713114239p:plain

アイテムの作成画面では次の様にセット。

項目
名前 室温(適当でOK)
タイプ Zabbix トラッパー
キー room_temp(わかれば適当でOK)
データ型 数値(浮動小数)
単位 ℃(わかれば適当でOK)

f:id:k-side:20160713114240p:plain

最後に追加をクリックしてアイテムの作成は完了。

zabbix_sender コマンドを実行する

次のオプションを付けて zabbix_sender を実行します。

オプション 渡す値
-z Zabbix サーバーのホストネームか IP アドレス
-s Zabbix に登録してあるホストネーム
-vv コマンド結果を詳細に標準出力する(vを2つ)
-k Zabbix サーバーでアイテムにセットしたキーの名称
-o キーの値、今回であれば室温(bme280.py の結果から)

今回は次のようなコマンドになりました。

$ /usr/local/bin/zabbix_sender -z 192.168.10.11 -s RaspberryPi -vv -k room_temp -o `/home/zoar/src/ss/bme280.py | cut -f1 -d','

結果は次のような感じ。

zabbix_sender [18751]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000107"}]
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000107"
sent: 1; skipped: 0; total: 1

processed: 1となっていれば成功。
失敗したら中身を確認して再チャレンジ。

Zabbix サーバーで確認

送信が成功したっぽかったら Zabbix のフロントエンドにアクセスして値を持ってるか確認します。
監視データ最新データで名前にアイテムの名前を入れてフィルタリングをクリックすると出てくると思います。

f:id:k-side:20160713114241p:plain

チェック時刻がどう見ても業務時間中です、ありがとうございました。

右側にあるグラフをクリックするとグラフを見ることができますが、値が1つだけだと直線で表示されるだけでした。

後はコマンドをシェルスクリプトなりにして cron に登録すれば Zabbix サーバーに向かって定期的に値を飛ばし続けてくれるはずです。

BME280 をからのデータを一般ユーザーで受け取る

debian jessie では GPIO 関係が一般ユーザーで利用できるようですが、現在は wheezy を利用しているので毎度 sudo しないといけません。

$ cat /etc/debian_version 
7.11

bme280_sample.py をそのまま実行すると Permission denied と言われてしまうのでアクセスしているデバイスを調べますした。

$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 -- 

/devi2c-1 にアクセスしているのでこいつのパーミッションを調べます。

$ ls -la /dev/i2c-1
crw-rw---T 1 root i2c 89, 1 Jul 12 20:20 /dev/i2c-1

i2c グループなら書き込みもできそうなので自分を i2c グループに追加します。

$ sudo usermod -aG i2c zoar

再起動してみて sudo なしに実行できれば OK。

$ python bme280_sample.py
temp :  28.85 ℃
pressure : 1004.26 hPa
hum :  45.11 %

これで今後の実行には sudo なしでいけるのでちょっとは楽に使えそうです。

BME280 の出力結果をカンマ区切りにしてみた

先日のRaspberry Pi に BME280 モジュールを接続して温度、湿度、気圧を計測するで出力された結果をカンマ区切りになるように変更してみました。

スイッチサイエンスで公開しているスクリプトを実行すると出力が次のようになります。

$ sudo python bme280_sample.py
temp : 26.36  ℃
pressure : 1007.30 hPa
hum :  62.44 %

結果を目視で確認するには十分ですが、結果を再利用しようとするとちょっと困るかもしれません。
なのでカンマ区切りで出力するようにスクリプトを変更しました。
次のように出力されます。

$ sudo bme280.py
26.36,62.44,1007.30

とりあえずパッチはこんな感じです。
python いじったの初めてかもしれない

patch コマンドで適用できます。
必要なら元のファイルをコピーするなどして使うといいと思います。

$ patch -u bme_sample.py < bme280.patch

出力結果は awk などを使って適当に取り出しができると思います。

Raspberry Pi に BME280 モジュールを接続して温度、湿度、気圧を計測する

BME280 モジュールを Raspberry Pi に接続して温度、湿度、気圧を計測したときのメモです。
BME280 はスイッチサイエンスからピンがはんだ付けされていないものを購入しました。

BME280搭載 温湿度・気圧センサモジュール

BME280搭載 温湿度・気圧センサモジュール

こちらの Qiita 記事を参考にしています、接続もこの通りです。

まず i2c 関係のツールが入っていないのでこれと、smbus をインストールします。

$ sudo apt-get install i2c-tools python-smbus -y

起動時にモジュールを読み込めるように設定を追加します。

$ sudo vi /boot/config.txt
device_tree=bcm2708-rpi-b.dtb
device_tree_param=i2c1=on
device_tree_param=spi=on

最後に追加すれば大丈夫っぽいです。
再起動してくればモジュールが読まれます。

これでモジュールにアクセスできるはずです。
i2cdetect でアドレスを確認すると、0x76 を使っています。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 --

スイッチサイエンスで公開しているスクリプトで各種データを取り出せるので取ってきます。

$ mkdir ~/src/ss
$ cd ss
$ wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py

BME280 にアクセスできるアドレスが 0x76 でなかった場合はダウンロードしたスクリプトの7行目に書かれたアドレスを変更すれば大丈夫な気がします。

i2c_address = 0x76

sudo でスクリプトを実行するとセンサーで取得した値が返ってきます。

$ sudo python bme280_sample.py
temp : 26.36  ℃
pressure : 1007.30 hPa
hum :  62.44 %

ファイルサーバーの隣にセンサーを設定しています。

User Local の人工知能ボット API で Hubot と会話した話

User Local という会社で人工知能ボット API が提供されているという情報があったのでその時点で申し込み、API が用意できたよというメールが来たので Hubot 用のスクリプトを書いてみました。
メッセージを JSON で渡すこともできるような記述を見た気がしたのですが、公式を見たところメッセージを URL エンコードして送る方が記述が多いのでそっちを使ってます。
プラットフォームの指定もできるようですが、Hubot で書いてコンソールで試した後に Twitter 用設定しようとしたのでプラットフォームは指定していません。

…なんかインデントがうまく表示されないっぽい?

カッコイイコードじゃない気がしますが、コンソールから起動して会話できたので OK ってことで。

キャラクターの設定できるようですが今は猫と犬と老人だったかな…他のがいいや、もっとできるようになったらその辺も使ってみたいです。

予定では今月下旬にプログラミング不要なフレームワークが公開されるっぽいので、そっち使った方が楽かもしれないですね。

やる気のない Twitter クライアントを作った

ツイートするだけの極めてやる気の無い Twitter クライアントを作りました。
昔あった大陸系クライアントのようにツイートするウィンドウだけが表示され、文字列を入力して Enter するとポストされます。
残り何文字使えるかもざっくり表示されています。

f:id:k-side:20160621125928p:plain

コードのリポジトリは Bitbucket で公開しています。

実行ファイルは公開していないので Visual Studio 2015 をインストールするなどしてビルドしてください。
あと Coretweet が必要になります。

クライアントのコンシューマーキー、コンシューマーシークレットも入っていないのでご自身で取得してください。
セットの方法は README か、キーの無い状態でビルドして実行するとセットの方法が表示されます。

さしあたって名前は餃子列島にしてありますが、CS/CK をセットにしていないので適当な名前をセットしてください。

コードのライセンスは NYSL Version 0.9982 です。

わざわざこのクライアントのために Visual Studio 2015 をインストールするとかないと思いますが。

追記

PowerShell からビルドできるかもしれないスクリプトを追加しました。
もしかしたら Visual Studio 入ってなくてもビルドできるかもしれません。

そして dynabook は旅だった

父親から預かった dynabook

調べたら HDD に不良セクタが発見され、意を決して SSD を注文したのです。

しかし、注文をしたその日に父親から連絡があり、使うつもりだった ThinkPad T61 が起動しなくなったとのこと。
実家にこれ以上現代機がない*1ので、SSD が届いた次の日に Windows 10クリーンインストールし、宅急便で実家に旅立ちました。

そしてこれで予備機もなくなったので、dynabook が壊れても次に渡せるパソコンを用意しておかなければなりません…。
どれ買おうかしら。

*1:ネットワークが切断された Windows XP 機はあるけど…