はじめに
前回は、CC2531のファームウェアを書き換え、Raspberry PiにNode-redとMosquittoをインストールしました。今回は、Raspberry Piにzigbee2mqttサーバをインストールして、zigbee機器を制御できるようにしていきます。
■実現に向けた連載
第1回:CC2531とRaspberry PIの準備
第2回:zigbee2mqttサーバのインストールとzigbee機器の接続 <–この記事
第3回:スマホ&Alexaインタフェースの実装
第2回:zigbee2mqttサーバのインストールとzigbee機器の接続
zigbee2mqttサーバのインストール
今回は、zigbee機器と通信するためにzigbee2mqttを利用します。zigbee2mqttは、メーカを問わず多くのzigbee機器をサポートしているので、異なるメーカのzigbee機器を接続して相互に運用することができます。
ちなみに、zigbee2mqttがサポートしているzigbee機器の一覧はここにリストがあります。2020年6月時点で、144メーカ、821機器をサポートしているようです‼️すごい‼️
①zigbee2mqttサーバのインストール
まずは、zigbee2mqttのソースコードをクローンして、piユーザが書き込めるようにパーミッションを変更します。
pi@raspberrypi:~ $ sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
Cloning into '/opt/zigbee2mqtt'...
remote: Enumerating objects: 147, done.
remote: Counting objects: 100% (147/147), done.
remote: Compressing objects: 100% (64/64), done.
remote: Total 10815 (delta 103), reused 117 (delta 83), pack-reused 10668
Receiving objects: 100% (10815/10815), 13.74 MiB | 2.13 MiB/s, done.
Resolving deltas: 100% (7920/7920), done.
pi@raspberrypi:~ $ sudo chown -R pi:pi /opt/zigbee2mqtt
②必要なモジュールのインストール
次に、zigbee2mqttに必要なモジュールを「npm ci」コマンドでインストールします。インストールには5〜8分ぐらいかかるので、気長に待ちましょう😊
pi@raspberrypi:~ $ cd /opt/zigbee2mqtt/
pi@raspberrypi:/opt/zigbee2mqtt $ npm ci
④zigbee2mqttの起動
必要モジュールがインストールされたら、「npm start」コマンドを入力して、zigbee2mqttサーバを起動してみましょう。起動すると前回インストールしたmosquittoに接続して、zigbee機器のペアリング待ち状態になります。
pi@raspberrypi:/opt/zigbee2mqtt $ npm start
> zigbee2mqtt@1.14.0 start /opt/zigbee2mqtt
> node index.js
zigbee2mqtt:info 2020-06-11 21:10:17: Logging to console and directory: '/opt/zigbee2mqtt/data/log/2020-06-11.21-10-17' filename: log.txt
zigbee2mqtt:info 2020-06-11 21:10:17: Starting zigbee2mqtt version 1.14.0 (commit #9009de2)
zigbee2mqtt:info 2020-06-11 21:10:17: Starting zigbee-herdsman...
zigbee2mqtt:info 2020-06-11 21:10:19: zigbee-herdsman started
zigbee2mqtt:info 2020-06-11 21:10:19: Coordinator firmware version: '{"type":"zStack12","meta":{"transportrev":2,"product":0,"majorrel":2,"minorrel":6,"maintrel":3,"revision":20190608}}'
zigbee2mqtt:info 2020-06-11 21:10:19: Currently 0 devices are joined:
zigbee2mqtt:warn 2020-06-11 21:10:19: `permit_join` set to `true` in configuration.yaml.
zigbee2mqtt:warn 2020-06-11 21:10:19: Allowing new devices to join.
zigbee2mqtt:warn 2020-06-11 21:10:19: Set `permit_join` to `false` once you joined all devices.
zigbee2mqtt:info 2020-06-11 21:10:19: Zigbee: allowing new devices to join.
zigbee2mqtt:info 2020-06-11 21:10:19: Connecting to MQTT server at mqtt://localhost
zigbee2mqtt:info 2020-06-11 21:10:19: Connected to MQTT server
zigbee2mqtt:info 2020-06-11 21:10:19: MQTT publish: topic 'zigbee2mqtt/bridge/state', payload 'online'
zigbee2mqtt:info 2020-06-11 21:10:19: MQTT publish: topic 'zigbee2mqtt/bridge/config', payload '{"version":"1.14.0","commit":"9009de2","coordinator":{"type":"zStack12","meta":{"transportrev":2,"product":0,"majorrel":2,"minorrel":6,"maintrel":3,"revision":20190608}},"log_level":"info","permit_join":true}'
これで、zigbee2mqttサーバのインストールは完了です。
zigbee機器のペアリング
ここからは、zigbee機器をRaspberry Piにペアリングしていきます。今回は、手元にあったIKEAのスマート電球「LED1732G11」と調光用リモコン「E1524」をペアリングしたいと思います。
①リモコンのペアリング
リモコンをペアリングするには、リモコンとCC2531を5cm以内に置き、リモコンの裏側の蓋を開けたところにある、ペアリングのスイッチを5秒以内に4回押します。
うまくいくと、コンソールに以下のように表示され、リモコンがペアリングされます。
zigbee2mqtt:info 2020-06-11 21:32:54: Device '0x680ae2fffe19472a' joined
zigbee2mqtt:info 2020-06-11 21:32:54: Starting interview of '0x680ae2fffe19472a'
zigbee2mqtt:info 2020-06-11 21:32:54: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_connected","message":{"friendly_name":"0x680ae2fffe19472a"}}'
zigbee2mqtt:info 2020-06-11 21:32:54: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"interview_started","meta":{"friendly_name":"0x680ae2fffe19472a"}}'
zigbee2mqtt:info 2020-06-11 21:32:56: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_announced","message":"announce","meta":{"friendly_name":"0x680ae2fffe19472a"}}'
zigbee2mqtt:info 2020-06-11 21:33:34: Successfully interviewed '0x680ae2fffe19472a', device has successfully been paired
zigbee2mqtt:info 2020-06-11 21:33:34: Device '0x680ae2fffe19472a' is supported, identified as: IKEA TRADFRI remote control (E1524/E1810)
zigbee2mqtt:info 2020-06-11 21:33:34: Configuring '0x680ae2fffe19472a'
zigbee2mqtt:info 2020-06-11 21:33:34: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"interview_successful","meta":{"friendly_name":"0x680ae2fffe19472a","model":"E1524/E1810","vendor":"IKEA","description":"TRADFRI remote control","supported":true}}'
zigbee2mqtt:info 2020-06-11 21:33:41: Successfully configured '0x680ae2fffe19472a'
②リモコンからのイベント送信
試しに、リモコンの前面ボタンを押してみましょう。すると、コンソールに以下のように表示され、リモコンのボタン押下イベントがzigbee2mqttに通知されている事が分かります。
zigbee2mqtt:info 2020-06-11 21:42:10: MQTT publish: topic 'zigbee2mqtt/0x680ae2fffe19472a', payload '{"update_available":false,"action":"toggle","linkquality":65}'
③スマート電球のペアリング
次に、IKEAのスマート電球をペアリングします。ただ、スマート電球のペアリングは少々コツがいります。まず、スマート電球を点けた状態にしてRaspberry Piとなるべく近くにしておきます。次に、家の壁のスイッチで「スイッチを消して、点けて」を6回繰り返します。一応、IKEAの公式手順のビデオはここにあります。ただ、私はこの通りにやっても、できませんでした😭
コツは、点けている時間を極力短くすることです。(少し長く)消して→点けて→(すぐに)消す、とすると良いようです。うまくいくと、電球が一回強く光って、以降は暗くなったり明るくなったりを繰り返します。強く光らず、暗くなったり明るくなったりを繰り返している場合は失敗です。
スマート電球のペアリングがうまくいくと、コンソールには以下のように表示されます。
zigbee2mqtt:info 2020-06-11 21:52:21: Device '0xec1bbdfffef84420' joined
zigbee2mqtt:info 2020-06-11 21:52:21: Starting interview of '0xec1bbdfffef84420'
zigbee2mqtt:info 2020-06-11 21:52:21: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_connected","message":{"friendly_name":"0xec1bbdfffef84420"}}'
zigbee2mqtt:info 2020-06-11 21:52:21: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"interview_started","meta":{"friendly_name":"0xec1bbdfffef84420"}}'
zigbee2mqtt:info 2020-06-11 21:52:24: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_announced","message":"announce","meta":{"friendly_name":"0xec1bbdfffef84420"}}'
zigbee2mqtt:info 2020-06-11 21:53:03: Successfully interviewed '0xec1bbdfffef84420', device has successfully been paired
zigbee2mqtt:info 2020-06-11 21:53:03: Device '0xec1bbdfffef84420' is supported, identified as: IKEA TRADFRI LED bulb E27 1000 lumen, dimmable, white spectrum, opal white (LED1732G11)
zigbee2mqtt:info 2020-06-11 21:53:03: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"interview_successful","meta":{"friendly_name":"0xec1bbdfffef84420","model":"LED1732G11","vendor":"IKEA","description":"TRADFRI LED bulb E27 1000 lumen, dimmable, white spectrum, opal white","supported":true}}'
これで、Raspberry Piとzigbee機器のペアリングは完了です。
④ペアリングモードの解除
全てのzigbee機器をペアリングしたら、zigbee2mqttののペアリングモードを解除します。ペアリングモードのままでも使えますが、セキュリティ上、新しい機器が勝手にzigbeeネットワークに参加してしまうのは危険なので、解除することをお勧めします。
ペアリングモードを解除するには「/opt/zigbee2mqtt/data/」にある「configuration.yaml」の「permit_join」をfalseに書き換えます。
pi@raspberrypi:/opt/zigbee2mqtt $ sudo vi /opt/zigbee2mqtt/data/configuration.yaml
homeassistant: false
permit_join: false <--falseに書き換える
mqtt:
base_topic: zigbee2mqtt
server: 'mqtt://localhost'
serial:
port: /dev/ttyACM0
⑤自動起動の設定
また、zigbee2mqttもraspberry Pi起動時に自動起動するようにsystemdに登録しておきます。「/etc/systemd/system/」に「zigbee2mqtt.service」ファイルを作成します。
pi@raspberrypi:~ $ sudo vi /etc/systemd/system/zigbee2mqtt.service
zigbee2mqtt.serviceファイルの中身は、以下のようにします。
[Unit]
Description=zigbee2mqtt
After=network.target
[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
ファイルを作成したら、以下のようにしてsystemdに登録して、zigbee2mqttサーバを起動しておきます。
pi@raspberrypi:~ $ sudo systemctl enable zigbee2mqtt.service
Created symlink /etc/systemd/system/multi-user.target.wants/zigbee2mqtt.service → /etc/systemd/system/zigbee2mqtt.service.
pi@raspberrypi:~ $ sudo systemctl start zigbee2mqtt.service
node-redからzigbee機器を操作する
ここからは、ペアリングしたzigbee機器をnode-redから扱えるようにしていきます。node-redからzigbee機器を操作するには、node-red-contrib-zigbee2mqttを使います。
①node-red-contrib-zigbee2mqttのインストール
PCのWebブラウザでNode-redの画面を開き、右上の「三」メニューから「パレットの管理」を選択します。
次に「ノードを追加」タブを開き、検索欄に「zigbee2mqtt」と入力します。すると、node-red-contrib-zigbee2mqttが出てきますので「ノードを追加」をクリックします。
正常にインストールが完了すると、以下のように4つのノードがパレットに追加されます。インストールには、だいたい5分程度かかりました。
②bridgeノードの追加
次に、左側パレットの「bridge」ノードをドラッグして追加します。「bridge」ノードが追加できたら、ダブルクリックして編集画面を開き、Server欄にある鉛筆アイコンをクリックします。
③zigbee2mqttサーバ設定
zigbee2mqttサーバの設定画面で「Host」欄に「localhost」と入力し「追加」ボタンをクリックします。この設定で、上でインストールしたzigbee2mqttサーバと接続されます。
「bridge」ノードの編集画面に戻ったら「完了」ボタンをクリックします。
④デプロイ
ノードを有効化するために、画面右上の「デプロイ」ボタンをクリックします。
⑤zigbee機器の確認
デプロイが完了すると「bridge」ノードの下に「online」と表示されます。またノードをダブルクリックして編集画面を開き、「Devices」タブを開くと、上でペアリングした機器が表示されます。
⑥Friendly nameの設定
初期設定では、Friendly nameは機器のMACアドレスになっているので、分かりやすい名前に変更しましょう。各機器のFriendly nameの欄を変更して、右側の「set」のボタンをクリックすればOKです。
⑦ボタンイベントの受信
次に、リモコンのボタンが押された時に、node-redでそのイベントを受信できるようにします。まず、左側のパレットからzigbee2mqttの「in」ノードをフローに追加し、編集画面のDevice欄でリモコンのデバイスを選択します。
次に「debug」ノードをフローに追加して、先ほど追加した「in」ノードと以下のように接続します。そして「デプロイ」ボタンをクリックします。
デプロイが完了したら、リモコンの前面ボタンを押してみましょう。以下の画面のように「in」ノードの下にOKと表示され、デバックウィンドウにメッセージが表示されればOKです‼️
⑦電球の操作
次に、node-redから電球を点けたり、消したりできるようにしてみます。まずzigbee2mqttの「out」ノードを追加し、編集画面で以下のように設定します。
・Device:電球
・Payload:種類で「文字列」を選択し、値に「toggle」と入力
次に「inject」ノードを追加し、「out」ノードと接続して「デプロイ」ボタンをクリックします。
デプロイが完了したら、電球に通電(家の壁スイッチON)しておき、Node-redの「inject」ノードのボタンを押してみましょう。ボタンを押すごとに、電球が点いたり、消えたりすればOKです‼️
おわりに
今回は、Raspberry Piにzigbee2mqttサーバをインストールしてzigbee機器とペアリングし、それをNode-redから操作できるようにしてみました。当然、リモコンのノードと電球のノードを接続すれば、リモコンのボタンを押すと電球が点いたり、消えたりするようにできます。
また、今回は手元にあった、IKEAのリモコンと電球を例に説明しましたが、他のメーカのセンサーや機器でもzigbee2mqttを使って制御することが可能です。そして、異なるメーカの機器どうしもNode-redで線を引くだけで連携して動作させることが可能です‼️
次回は、連載の最後、zigbee機器をスマホやAmazon Alexaから操作できるようにしてみたいと思います。
■実現に向けた連載
第1回:CC2531とRaspberry PIの準備
第2回:zigbee2mqttサーバのインストールとzigbee機器の接続
第3回:スマホ&Alexaインタフェースの実装 <–次はこれ
コメント