KUSONEKOの見る世界

Bluetoothドングルの抜き差しをZabbixから実行

我が家では、BluetoothドングルでSwitchBotから情報を取得し、ZabbixでグラフやLINE通知を行っています。

SwitchBot温湿度計の値をLinuxで取得しLINEへ通知 | KUSONEKOの見る世界

LinuxサーバでBluetoothを使用し、SwitchBot温湿度計プラスの情報を取得しました。その情報からZabbixでグラフやアラートをLINEに通知できるようにしました。

SwitchBot プラグミニの消費電力を取得しZabbixでグラフ化 | KUSONEKOの見る世界

LinuxサーバでBluetoothを使用し、SwitchBotプラグミニに繋いだエアコンの消費電力を取得しました。その情報からZabbixでグラフを作ってみました。

しかし、Bluetoothドングルが不調になり、エラーが出て情報が取得できなくなることが多々あります。
復旧させるには、サーバを再起動するか、Bluetoothドングルの抜き差しをする必要があります。
これを毎回やるのは面倒です。

調べてみると、LinuxであればUSBの抜き差しはコマンドで実施できることが分かりました。(物理的に抜き差しするわけではないですが)

サーバ環境:
CentOS Stream release 9
Zabbix 6.0.25

対象のUSBのBUS IDを調べる

まずは、BluetoothドングルのBUS IDを調べます。

# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

# dmesg | grep 0a12
[    3.289984] usb 1-5.2: New USB device found, idVendor=0a12, idProduct=0001, bcdDevice=88.91

これでBUS IDが1-5.2ということが分かりました。

抜き差しコマンド

以下のコマンドで疑似的に抜き差しが実現できます。(スクリプトで実行するため、フルパスで書いています)

# /bin/echo 1-5.2 | /bin/tee /sys/bus/usb/drivers/usb/unbind
# /bin/echo 1-5.2 | /bin/tee /sys/bus/usb/drivers/usb/bind

Zabbix設定

スクリプト作成

[管理]→[スクリプト]
[スクリプト作成]を押下。

名前:Bluetooth unplug plug
範囲:アクション処理
タイプ:スクリプト
次で実行:Zabbixエージェント
コマンド:/bin/echo 1-5.2 | /bin/tee /sys/bus/usb/drivers/usb/unbind
/bin/echo 1-5.2 | /bin/tee /sys/bus/usb/drivers/usb/bind
ホストグループ:すべて

[追加]を押下。

Zabbix Agentでコマンドの許可

Zabbix Agentの設定変更。

# vi /etc/zabbix/zabbix_agentd.conf
(最後に追記)
AllowKey=system.run[*]

コマンドをそのまま書くと、『Unsupported item key.』となってしまうため『*』を使用しました。
原因は今のところ不明です。

# vi /usr/lib/systemd/system/zabbix-agent.service
(ユーザ、グループを変更)
User=root
Group=root
# systemctl daemon-reload
# systemctl restart zabbix-agent

トリガー作成

SwitchBotの情報を取得するスクリプトを実行時、Tracebackという文字列が返ってきた場合をトリガーにします。

[設定]→[ホスト]→[Zabbix server]→[トリガー]
[トリガーの作成]を押下。

名前:Bluetoothドングル エラー
深刻度:軽度の障害
条件式:left(last(/Zabbix server/system.run[python3 /root/myscript/switchbot-meter_zabbix.py]),9)="Traceback"

[追加]を押下。

トリガーアクション作成

[設定]→[アクション]→[トリガーアクション]
[アクション作成]を押下。

名前:Bluetooth抜き差し
実行条件:[追加]を押下
  タイプ:トリガー
  オペレータ:等しい
  トリガー:Bluetoothドングル エラー
実行内容 1
  実行内容:[追加]を押下
    処理内容:Bluetooth unplug plug
    ターゲットリスト:現在ホストにチェック
    [Add]を押下

[追加]を押下。

実行結果

以下の通り、エラー発生時にドングルの抜き差しが実行されるようになりました。

Zabbix Bluetoothエラー検知

上記のアクション部分をクリックすると、以下のような実行内容が表示されます。

Zabbix Bluetoothエラー復旧コマンド実行