はじめに
第1回目の記事では、Raspberry PiにOpenHABをインストールし、MQTTのアドオンをインストールして準備を行いました。今回は、zigbee機器をペアリングし、実際にOpenHABから操作してみたいと思います。
第1回:OpenHABとアドオンのインストールと設定
第2回:IKEAスマート電球のペアリングと操作 <–この記事
第2回:IKEAスマート電球のペアリングと操作
CC2531 USBスティックの接続
まずは、CC2531 USBスティックをRaspberry Piに接続し、動作確認を行います。
①USBスティックの接続
Raspberry PiのUSBポートにCC2531 USBスティックを差し込みます。USB 2.0のポートでもUSB 3.0のポートでもどちらでも大丈夫です。USBスティックを差し込むと、USBスティックのLEDが緑色に光ります。
②dmesgの確認
SSHログインしたコンソールで以下のコマンドを入力して、dmesgを確認します。「Product: TI CC2531 USB CDC」という行があれば、正しく認識できています。
openhabian@openhab:/opt/zigbee2mqtt$ dmesg
・・・中略・・・
[ 1146.272970] usb 1-1.2: new full-speed USB device number 3 using xhci_hcd
[ 1146.411720] usb 1-1.2: New USB device found, idVendor=0451, idProduct=16a8, bcdDevice= 0.09
[ 1146.411736] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1146.411749] usb 1-1.2: Product: TI CC2531 USB CDC
[ 1146.411761] usb 1-1.2: Manufacturer: Texas Instruments
[ 1146.411773] usb 1-1.2: SerialNumber: __0X00124B0014D99402
[ 1146.489086] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
[ 1146.491559] usbcore: registered new interface driver cdc_acm
[ 1146.491567] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
③USB接続状況の確認
次に、lsusbコマンドで確認します。ここでは「Texas Instruments, Inc.」の行が表示されていれば、正しく認識できています。
openhabian@openhab:/opt/zigbee2mqtt$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0451:16a8 Texas Instruments, Inc.
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
openhabian@openhab:/opt/zigbee2mqtt$
④シリアルポートの確認
次に、以下のようにしてシリアルポート用のファイルディスクリプタがあるか確認します。「/dev/ttyACM0」が存在していればOKです。
openhabian@openhab:/opt/zigbee2mqtt$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 Jul 18 20:50 /dev/ttyACM0
openhabian@openhab:/opt/zigbee2mqtt$
以上で、CC2531 USBスティックの接続は完了です。
zigbee2MQTTのインストール
次に、Zigbee機器を制御するためにzigbee2MQTTをインストールします。zigbee2MQTTはアドオンでは提供されていないので、手動でインストールします。
①zigbee2MQTTのダウンロード
以下のコマンドを入力して、zigbee2MQTTをダウンロードします。また、ダウンロードしたファイルのオーナを「openhabian」に変更します。
openhabian@openhab:~$ sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
Cloning into '/opt/zigbee2mqtt'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 11402 (delta 5), reused 8 (delta 2), pack-reused 11383
Receiving objects: 100% (11402/11402), 14.24 MiB | 4.67 MiB/s, done.
Resolving deltas: 100% (8382/8382), done.
openhabian@openhab:~$ sudo chown openhabian:openhabian /opt/zigbee2mqtt/
④必要モジュールのインストール
次にダウンロードフォルダに移動して、「npm ci」コマンドを入力し、zigbee2MQTTに必要なモジュールをインストールします。
openhabian@openhab:~$ cd /opt/zigbee2mqtt/
openhabian@openhab:/opt/zigbee2mqtt$ npm ci
⑤zigbee2MQTTの動作確認
必要なモジュールのインストールが完了したら、「npm start」と入力してzigbee2MQTTを起動します。
ここでの確認ポイントは、USBスティックに正しく接続できていることを示す「zigbee-herdsman started」と、MQTT Brokerに正しく接続できている事を示す「Connected to MQTT server」の2行が表示されている点です。
openhabian@openhab:/opt/zigbee2mqtt$ sudo npm start
> zigbee2mqtt@1.14.1 start /opt/zigbee2mqtt
> node index.js
zigbee2mqtt:info 2020-07-18 20:55:24: Logging to console and directory: '/opt/zigbee2mqtt/data/log/2020-07-18.20-55-24' filename: log.txt
zigbee2mqtt:info 2020-07-18 20:55:24: Starting zigbee2mqtt version 1.14.1 (commit #f8463d9)
zigbee2mqtt:info 2020-07-18 20:55:24: Starting zigbee-herdsman...
zigbee2mqtt:info 2020-07-18 20:55:27: zigbee-herdsman started
zigbee2mqtt:info 2020-07-18 20:55:27: Coordinator firmware version: '{"type":"zStack12","meta":{"transportrev":2,"product":0,"majorrel":2,"minorrel":6,"maintrel":3,"revision":20190608}}'
zigbee2mqtt:info 2020-07-18 20:55:27: Currently 0 devices are joined:
zigbee2mqtt:warn 2020-07-18 20:55:27: `permit_join` set to `true` in configuration.yaml.
zigbee2mqtt:warn 2020-07-18 20:55:27: Allowing new devices to join.
zigbee2mqtt:warn 2020-07-18 20:55:27: Set `permit_join` to `false` once you joined all devices.
zigbee2mqtt:info 2020-07-18 20:55:27: Zigbee: allowing new devices to join.
zigbee2mqtt:info 2020-07-18 20:55:27: Connecting to MQTT server at mqtt://localhost
zigbee2mqtt:info 2020-07-18 20:55:28: Connected to MQTT server
zigbee2mqtt:info 2020-07-18 20:55:28: MQTT publish: topic 'zigbee2mqtt/bridge/state', payload 'online'
zigbee2mqtt:info 2020-07-18 20:55:28: MQTT publish: topic 'zigbee2mqtt/bridge/config', payload '{"version":"1.14.1","commit":"f8463d9","coordinator":{"type":"zStack12","meta":{"transportrev":2,"product":0,"majorrel":2,"minorrel":6,"maintrel":3,"revision":20190608}},"log_level":"info","permit_join":true}'
以上で、zigbee2MQTTのインストールは完了です。
zigbee機器のペアリング
次に、IKEAのリモコンとスマート電球をペアリングしていきます。
①リモコンのペアリング
リモコンとRaspberry Piを5cm以内に置き、リモコンの裏側の蓋を開けたところにある、ペアリングのスイッチを5秒以内に4回押します。
ペアリングがうまくいくと、zigbee2MQTTの画面に以下のように表示されます。ログからも「E1524/E1810」として正しく認識されたことが確認できます。
zigbee2mqtt:info 2020-07-18 21:32:44: Device '0x680ae2fffe19472a' joined
zigbee2mqtt:info 2020-07-18 21:32:44: Starting interview of '0x680ae2fffe19472a'
zigbee2mqtt:info 2020-07-18 21:32:44: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_connected","message":{"friendly_name":"0x680ae2fffe19472a"}}'
zigbee2mqtt:info 2020-07-18 21:32:44: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"interview_started","meta":{"friendly_name":"0x680ae2fffe19472a"}}'
zigbee2mqtt:info 2020-07-18 21:32:46: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_announced","message":"announce","meta":{"friendly_name":"0x680ae2fffe19472a"}}'
zigbee2mqtt:info 2020-07-18 21:33:23: Successfully interviewed '0x680ae2fffe19472a', device has successfully been paired
zigbee2mqtt:info 2020-07-18 21:33:23: Device '0x680ae2fffe19472a' is supported, identified as: IKEA TRADFRI remote control (E1524/E1810)
zigbee2mqtt:info 2020-07-18 21:33:23: Configuring '0x680ae2fffe19472a'
zigbee2mqtt:info 2020-07-18 21:33:23: 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-07-18 21:33:30: Successfully configured '0x680ae2fffe19472a’
ここで、表示される「0x680ae2fffe19472a」というデバイス名は後で使うので、テキストエディタなどにメモしておきましょう。
②スマート電球のペアリング
次に、スマート電球をペアリングします。スマート電球のペアリングは少々コツがいります。まず、スマート電球を点けた状態にしてRaspberry Piとなるべく近くにしておきます。次に、家の壁のスイッチで「スイッチを消して、点けて」を6回繰り返します。一応、IKEAの公式手順のビデオはここにあります。ただ、私はこの通りにやっても、できませんでした😭
コツは、点けている時間を極力短くすることです。(少し長く)消して→点けて→(すぐに)消す、とすると良いようです。うまくいくと、電球が一回強く光って、以降は暗くなったり明るくなったりを繰り返します。強く光らず、暗くなったり明るくなったりを繰り返している場合は失敗です。
うまくいくと、zigbee2MQTTの画面に以下のように表示されます。ログからも「IKEA TRADFRI LED bulb E27 1000」として正しく認識されたことが確認できます。
zigbee2mqtt:info 2020-07-18 21:35:29: Device '0xec1bbdfffef84420' joined
zigbee2mqtt:info 2020-07-18 21:35:29: Starting interview of '0xec1bbdfffef84420'
zigbee2mqtt:info 2020-07-18 21:35:29: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_connected","message":{"friendly_name":"0xec1bbdfffef84420"}}'
zigbee2mqtt:info 2020-07-18 21:35:29: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"pairing","message":"interview_started","meta":{"friendly_name":"0xec1bbdfffef84420"}}'
zigbee2mqtt:info 2020-07-18 21:35:32: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"type":"device_announced","message":"announce","meta":{"friendly_name":"0xec1bbdfffef84420"}}'
zigbee2mqtt:info 2020-07-18 21:36:06: Successfully interviewed '0xec1bbdfffef84420', device has successfully been paired
zigbee2mqtt:info 2020-07-18 21:36:06: Device '0xec1bbdfffef84420' is supported, identified as: IKEA TRADFRI LED bulb E27 1000 lumen, dimmable, white spectrum, opal white (LED1732G11)
zigbee2mqtt:info 2020-07-18 21:36:06: 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}}'
zigbee2mqtt:info 2020-07-18 21:36:21: MQTT publish: topic 'zigbee2mqtt/0xec1bbdfffef84420', payload '{"update_available":false}'
ここでもデバイス名をメモしておきます。
③systemdの設定
ペアリングができたら、zigbee2MQTTを起動しているコンソールで「ctrl+c」を押して、zigbee2MQTTを一旦終了させます。そして、OpenHAB起動時にzigbee2MQTTが自動起動するようにsystemdに登録します。
まずは「/etc/systemd/system/」にsystemd用の設定ファイル「zigbee2mqtt.service」を作成します。
openhabian@openhab:/opt/zigbee2mqtt$ 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=root
[Install]
WantedBy=multi-user.target
設定ファイルが作成できたら、以下のコマンドを入力して、systemdに登録します。また、systemdを使って、zigbee2MQTTを起動させます。
openhabian@openhab:/opt/zigbee2mqtt$ sudo systemctl enable zigbee2mqtt.service
Created symlink /etc/systemd/system/multi-user.target.wants/zigbee2mqtt.service → /etc/systemd/system/zigbee2mqtt.service.
openhabian@openhab:/opt/zigbee2mqtt$ sudo systemctl start zigbee2mqtt.service
また、以下のコマンドで、zigbee2MQTTが正しく起動できている事を確認します。「Active: active」となっていればOKです。
openhabian@openhab:/opt/zigbee2mqtt$ sudo systemctl status zigbee2mqtt.service
● zigbee2mqtt.service - zigbee2mqtt
Loaded: loaded (/etc/systemd/system/zigbee2mqtt.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-07-18 21:07:02 JST; 6s ago
Main PID: 10503 (node)
Tasks: 23 (limit: 4154)
Memory: 42.4M
CGroup: /system.slice/zigbee2mqtt.service
├─10503 npm
├─10517 sh -c node index.js
└─10518 node index.js
以上で、zigbee機器のペアリングは完了です。
Thingsの登録
次に、ペアリングしたzigbee機器をOpenHABにThingsとして登録します。Thingsへの登録はOpenHABのPaperUIからも可能ですが、細かいところに手が届かないので今回は設定ファイルを記載する方法で行います。
特にMQTT機器のChannelをDimmerとして設定できず、今回のようにスマート電球を利用したい場合には、GUIでは設定できません。やり方知っている方居たら、教えて下さい🙏
①Things設定ファイルの作成
Thingsをファイルで設定する場合には「/etc/openhab2/things/」フォルダに「.things」の拡張子を持つファイルを作成します。
今回の場合には、「ikea.things」というファイルを以下のように作成します。
openhabian@openhab:/var/log/openhab2$ cd /etc/openhab2/things/
openhabian@openhab:/etc/openhab2/things$ vi ikea.things
ikea.thingsの内容は、以下の通りです。なお、「0xec1bbdfffef84420」は、上でメモしたスマート電球のデバイス名、「0x680ae2fffe19472a」はリモコンのデバイス名にそれぞれ置換して下さい。
Bridge mqtt:systemBroker:embedded-mqtt-broker [host="localhost", secure=false]
{
//Lights
Thing topic 0xec1bbdfffef84420 "IKEA Light" @ "IKEA Light" {
Channels:
Type switch : IKEA_Light_Switch "IKEA_Light_Switch" [commandTopic="zigbee2mqtt/0xec1bbdfffef84420/set", formatBeforePublish="toggle"]
Type dimmer : IKEA_Light_Brightness "IKEA_Light_Brightness" [commandTopic="zigbee2mqtt/0xec1bbdfffef84420/set", min=1, max=254, step=1, formatBeforePublish="{ \"brightness\" : %s }"]
Type dimmer : IKEA_Light_ColorTemp "IKEA_Light_ColorTemp" [commandTopic="zigbee2mqtt/0xec1bbdfffef84420/set", min=250, max=450, step=1, formatBeforePublish="{ \"color_temp\" : %s }"]
}
//Remote
Thing topic 0x680ae2fffe19472a "IKEA_Remote" @ "IKEA_Remote" {
Channels:
Type string : IKEA_Remote_Power "IKEA_Remote_Power" [stateTopic="zigbee2mqtt/0x680ae2fffe\
19472a", trigger="true", retained=true]
}
}
このファイルが、今回の肝になる部分なので、記載内容を解説していきます。
まず、1行目でMQTT BrokerのThingを指定します。今回はアドオンでインストールしたMQTT Brokerを利用するので「mqtt:systemBroker:embedded-mqtt-broker」となります。
5行目〜11行目でスマート電球のThingを定義しています。5行目では、topic(MQTT)型のThingとして、ThingID「0xec1bbdfffef84420」のThingを定義し、表示ラベルとして「IKEA Light」、設置場所として「IKEA Light」を設定しています。設置場所は「リビング」などとしても良いですが、これはPaperUIのタブにあたるものなので、今回は上のようにしてみました。
次に、7〜9行目で、スマート電球のチャネルを定義しています。7行目では、スマート電球をOn/Offするチャネルとして、switch型のチャネルを定義しています。「IKEA_Light_Switch」はチャネルID、「IKEA_Light_Switch」は表示ラベルになります。また、その後の「commandTopic=”zigbee2mqtt/0xec1bbdfffef84420/set”」はOpenHAB上のスイッチを操作した時に、送信するMQTTメッセージのトピック、「formatBeforePublish=”toggle”」は送信するメッセージ内容となります。この記述により、OpenHAB上のスイッチが操作されると「zigbee2mqtt/0xec1bbdfffef84420/set」に「toggle」のメッセージが送信されるという具合になります。同様に、明るさ調節のチャネル、電球色のチャネルを定義しています。
その後、14〜18行目で、リモコンのThingを定義しています。特筆すべきは16行目のチャネル定義かと思います。ここでは「stateTopic=”zigbee2mqtt/0x680ae2fffe19472a”」の値が変更になったら、イベントを発行するように設定しています。つまり、リモコンのボタンが押されたらOpenHAB上でイベントが発生し、そのイベントを受けてスマート電球を動作させるという形になります。
②Thingsの確認
設定ファイルを記述し、保存したら、OpenHAB画面の左メニューのThingsをクリックしてThingsの画面を表示します。すると、以下のように設定ファイルで記述した2つのThingsが追加されていることが確認できます。
なお、追加したThingsが出てこない場合は、設定ファイルの誤りが原因だと思われますので「/var/log/openhab/openhab.log」を確認し、エラー原因を特定しましょう。
また、OpenHABでは設定ファイルで追加したThingsをGUI画面上で変更することはできませんので、変更する場合には設定ファイルを編集する必要があります。
以上で、Thingsの追加は完了です。
Itemsの追加
ここからは、Thingsに紐づくItemsを追加していきます。
①Thingの選択
まずは、「IKEA_Light」の左のアイコンをクリックします。
②Linkの追加
次に、IKEA_Light_Switchの右にある矢印のアイコンをクリックすると表示される「Linked Items」の「+」ボタンをクリックします。
③Itemの追加
Link channelの画面が表示されたら、「Please select the item to link」欄の下向き矢印をクリックします。
「+Create new item」の表示が出たら、これをクリックします。
さらにLinkの設定画面が表示されるので「LINK」をクリックします。
④Linkの確認
Thingの画面に戻ると、「Linked Items」の下にItemが追加されています。
⑤他のItemsの追加
IKEA_Light_Switchと同様に「IKEA_Light_Brightness」と「IKEA_Light_ColorTemp」についてもLinkを追加します。追加が完了すると、以下のようになります。
⑥Itemsの確認
3つのLinkが追加できたら、左メニューから「Items」を選択してみましょう。以下のように3つのItemsが追加されていることが確認できます。
①スマート電球の動作確認
それでは、スマート電球をOpenHABから操作してみましょう。左メニューから「Control」を選択します。
すると、以下の画面のように、スマート電球のスイッチ、明るさ調整のスライドバー、電球色変更のスライドバーが表示されるので、これを操作してみます。どうですか?ちゃんとスマート電球は動きましたか?ちなみに、スマート電球に通電しておくのをお忘れなく(笑)
ルールの作成
ここからは、リモコンのボタンが押されたらスマート電球がOn/Offするようにルールを設定していきます。
①リモコンの設定画面の表示
左メニューより「Configuration」→「Things」を選択し、Thingsの画面を表示させ「IKEA_Remote」を選択します。
②Chanell-IDの取得
IKEA_Remote_Powerのチャネルが表示されるので、そこに表示されているChanell-IDをコピーしてテキストエディタなどにメモしておきます。
③ルールの記述
コンソール画面に戻り「/etc/openhab2/rules/」に「.rules」拡張子を持つルールファイルを作成します。今回は「ikea.rules」というファイルを作成することにします。
openhabian@openhab:/etc/openhab2/things$ cd ../rules/
openhabian@openhab:/etc/openhab2/rules$ emacs ikea.rules
ikea.rulesの中身は以下の通りです。「mqtt:topic:embedded-mqtt-broker:0x680ae2fffe19472a:IKEA_Remote_Power」の部分は上でメモしたChannel-IDに、「0xec1bbdfffef84420」の部分はスマート電球のデバイス名に置換して下さい。
rule "IKEA_Remote_Action"
when
Channel "mqtt:topic:embedded-mqtt-broker:0x680ae2fffe19472a:IKEA_Remote_Power" triggered
then
val actions = getActions("mqtt","mqtt:systemBroker:embedded-mqtt-broker")
actions.publishMQTT("zigbee2mqtt/0xec1bbdfffef84420/set","toggle")
End
簡単に解説すると、1行目はルール名の定義です。3行目がルールを実行する条件の記述で、リモコンのチャネルを指定することで、リモコンのボタンが押されたら動作するように設定します。5・6行目が、動作の部分であり、5行目でMQTTブローカのオブジェクトを取得し、6行目でMQTTメッセージを送信しています、今回はスマート電球のトピックに「toggle」メッセージを送信しています。
④動作確認
ルールファイルを記述し保存したら、動作確認をしましょう。リモコンの前面ボタンを押してみて下さい。スマート電球がOn/Offすれば完成です‼️
なお、ルールが実行されたかは「/var/log/openhab/event.log」に記録されるので、このファイルを確認するとルールが実行された様子が確認できます。
おわりに
今回はRaspberry PiにインストールしたOpenHABを利用して、zigbee機器をベアリングし、OpenHABにThingsとして登録し、操作することをやってみました。
スマート電球をOpenHABの画面から操作するだけではなく、リモコンとスマート電球を連携させて、リモコンの動作に応じてスマート電球を操作することも可能となりました。
OpenHABのGUI画面はまだまだ細かいところに手が届かないですが、設定ファイルから設定することでかなり細かい点まで設定でき、いろいろなことができると感じました。
第1回:OpenHABとアドオンのインストールと設定
第2回:IKEAスマート電球のペアリングと操作 <–この記事
コメント