ESP-WROOM-02で直にzabbix senderを実現するライブラリを作った

# はじめに
昨今、低価格WiFiモジュールESP-WROOM-02の登場によって、組み込み無線通信が一気に手軽になりました。ESP-WROOM-02の特筆すべき点はTCPIPプロトコルスタックを内蔵している点で、これにより特別な実装無しに既存のネットワーク機器やサーバと対話できる点です。
この特徴を活かすと、zabbixプロトコルをESP-WROOM-02に直接喋らせることにより各種センサーデータを簡単に収集、活用できます。
その気になれば一般家庭にある無線ルーターと中古で数千円で買ったサーバ、そして複数台のESP-WROOM-02で防犯システムや家庭内での熱中症アラートみたいなセンサネットワークの活用が可能かもしれません。

といった考えのもと、簡単にzabbix senderプロトコルを喋るための機能をESP-WROOM-02で簡単に使えるようにするため、ライブラリ化しました。

**2024年7月26日追記**  
GitHubアカウントを作り直したため、リポジトリのリンクが切れてしまっていました。  
リポジトリ本体を [Kajdocsi Szabolcs氏](https://github.com/zaphodus/ESP8266ZabbixSender) が [フォーク・アーカイブ](https://github.com/zaphodus/ESP8266ZabbixSender) して残してくださっていました。  
以下リンクは再フォークし直したものを参照しています。

# インストール
ライブラリは以下のリポジトリから取得してインストールしてください。
https://github.com/marineotter/ESP8266ZabbixSender

* git cloneでのインストール  
READMEを参照してください
* zipとしてインポート  
 * 「Clone or download」→「Download ZIP」
 * Arduino IDEにて「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール...」

# インタフェース
簡単なサンプルを`sample_ESP8266ZabbixSender/sample_ESP8266ZabbixSender.ino`に記述しています。

* `ESP8266ZabbixSender.Init(IPAddress(192, 168, 35, 14), 10051, "IOTBOARD_00")`  
    送信先zabbixサーバ、アイテムのホスト名を設定するメソッドです。送信前に必ず一度は呼び出してください。
* `ESP8266ZabbixSender.ClearItem()`   
    サーバへ送るデータをクリアするメソッドです。一度データを送った後に再度データを追加する前に呼び出してください。
* `ESP8266ZabbixSender.AddItem("air.temp", 29.62)`   
    サーバへ送るデータを追加するメソッドです。引数にはkey, 値で、keyはString型、値は現時点ではfloatのみ対応です。
* `ESP8266ZabbixSender.Send()`   
    サーバへデータを送信するメソッドです。送信後、タイムアウト時間内（デフォルトで1sec）に返答が帰ってくればEXIT_SUCCESSを、そうでなければEXIT_FAILUREをリターンします。

# 制約及び今後の課題

* 送信データ数は同時に50件までです。それだけあれば通常は足りるとは思いますが、改善を考えています。
* 送信データの型は現段階ではfloatのみです。センサーの値を送るという目的では十分ですが、Stringやintなども送信できるよう拡張予定です。
* サーバからの戻り値のパースが十分じゃないです。送信したデータの幾つかが処理に失敗してもSUCCESSを返します。デバッグ出力はシリアルモニタに出力しているのでそちらを確認お願いします。

# 実際の使用例
室温/湿度センサーを元に不快指数を計算し、警告を通知する場合の使い方です。
### ソースコード
以下のリポジトリにあるとおりです。WiFi関連の設定を追加のヘッダファイルを作成して記述し、zabbixサーバの設定を合わせます。

https://github.com/marineotter/ESP8266ZabbixSender
### zabbixサーバの設定
今回の場合
「IOTBOARD_00」というホストを作成し、アイテム「Temperture」「Humidity」「Discomfort Index」を以下の通り作成します。
![zabbix1.PNG](https://qiita-image-store.s3.amazonaws.com/0/137898/3a2b3d61-3880-52f4-ca0e-cf7f27f83bdc.png)

TempertureやHumidityはZabbixトラッパーとしてこのように設定します。
![zabbix2.PNG](https://qiita-image-store.s3.amazonaws.com/0/137898/99205ea7-bcec-984a-8116-f5329e08d7cf.png)

Disconfort Indexは以下のように、計算アイテムとして不快指数の計算式を設定します。
![zabbix3.PNG](https://qiita-image-store.s3.amazonaws.com/0/137898/597e9783-f82b-f34a-31a4-4c58019e7489.png)

更に、トリガの設定を以下のように引っ掛けることで、不快指数の閾値よりの低下、及び上昇を検出できます。検出ができるとzabbixの機能によりメールやTwitter等での通知につなげることが容易です。
![zabbix4.PNG](https://qiita-image-store.s3.amazonaws.com/0/137898/f82a4c79-6188-17b0-2cfb-03589d515237.png)

得られたデータは以下のようにグラフ化するもよし、APIを使って応用するもよしです。
![zabbix5.PNG](https://qiita-image-store.s3.amazonaws.com/0/137898/b7358ebe-8113-3cb9-8dda-8152ffc9c8a6.png)

# さいごに
zabbixプロトコルの利用という点に関して言えば、つい3日ほど前に以下の記事が投稿されてしまいました。出遅れた…
[ESP-WROOM-02からZabbixサーバーにZabbix senderプロトコルでデータを送信する - Qiita](http://qiita.com/mutz0623/items/2c7eae0f762d760875bb)

それはそうと、本ライブラリによって、センサデータ等の収集のために気軽にzabbixを利用できる人が増えれば嬉しいなという感じです。

# 参考
[Zabbix meeting 20101218_02-2 (Takanori Suzuki) ](http://www.slideshare.net/BlueSkyDetector/zabbix-meeting-20101218022-takanori-suzuki)