Raspberry PiとNode-redで、Hueブリッジ(Zigbee Hub)を作ってみた(スマホ&Alexa操作対応)[1/3]

スマートホーム
スポンサーリンク

はじめに

スマートホームといえば、Philipsのスマート電球「Hue」が有名ですよね💡ただ、Hueのスマート電球は、Zigbeeを使っているので、PCやスマホから直接操作することはできず、Hueブリッジ(Zigbee Hub)が必要となります。そして、Hueブリッジは結構高い(約6,300円)😂

また最近は、IKEAのスマート電球TRADFRI、Aqaraの温度センサー・スイッチGravioなど、Zigbeeに対応した機器がどんどん出てきています。しかし、これらは互換性が無く(HueとTRADFRIはOK)、別々にZigbee Hubやスマホアプリが必要だったりします。さらに、メーカ・アプリを跨って連携できないので、利用者からすると、不便極まりない状態です。

そこで、今回はRaspberry PiとNode-redを使って、メーカに関係なくZigbee機器を接続できるZigbee Hubを作ってみようと思います‼️もちろん、Hueブリッジと同様にAmazon Alexaから音声で機器を音声操作したり、スマホから操作できるようにもします。

やりたいこと

今回は、Raspberry Piを使って、以下のような構成でZigbee Hubを実現していきます。

 ・スマホ用のユーザインタフェースはHTMLで実現
 ・HTMLのボタンを押すとnode-redのWEB API(http inノード)を呼び出し
 ・Alexaとのインタフェースはnode-red-contri-amazon-echoで実現
 ・スマホ/Alexaからの操作イベントをnode-red-contrib-zigbee2mqttで処理
 ・操作イベントはmosquitto経由でzigbee2mqttサーバに送信
 ・zigbee2mqttサーバでCC2531を制御してzigbee機器と通信

これを実現するために、3回に分けて記事を書いていきます(予定)。

 第1回:CC2531とRaspberry Piの準備  <–この記事
 第2回:zigbee2mqttサーバのインストールとzigbee機器の接続
 第3回:スマホ&Alexaインタフェースの実装

用意するもの

①Raspberry PI

まずは、今回のZigbee HubのメインとなるRaspberry Piが必要です。今回は、最近新しく買ったRaspberry Pi 4Bを使います。性能は必要ないので、Raspberry Pi Zeroでも大丈夫です。

②CC2531 USBトグル

Raspberry Pi単体ではZigbee通信(IEEE802.15.4)はできないので、Zigbee通信を行うために、CC2531 USBトグルが必要です。また、新規に購入するのであれば、下のCC Debuggerと接続するための、ケーブルがセットになっているものがお勧めです。

③CC Debugger

これは最終的には不要ですが、CC2531のファームウェアを書き換えるために必要です。

必要なものはこの3点です。Zigbee Hubを経由して操作する電球やセンサーなどの、Zigbee機器は、目的に合わせて別途用意して下さいね。

第1回:CC2531とRaspberry PIの準備

必要なものが揃ったら、さっそくZigbee Hubを作っていきます。

CC2531のファームウェアの書き換え

購入したばかりのCC2531は、Zigbee通信のキャプチャ用のファームウェアが入っているので、Zigbee機器と通信するためには、ファームウェアの書き換えが必要です。

①SmartRF Flash programmerのダウンロード

Windows PCのWebブラウザを用いて、ファームウェア書き換え用のツール「SmartRF Flash programmer」を、Texas Instrumentsのサイトからダウンロードします。v2もありますが、うまく動かないようなので、v1をお勧めします。

②ユーザ登録

ダウンロードするためには、ユーザ登録が必要なので必要事項を入力してユーザ登録します。

③輸出管理事項への同意

ユーザ登録が完了するとSmartRF Flash programmerのダウンロード画面に戻ります。ここで、輸出管理の画面が表示されます。「U.S. Government」と出ているとビックリ‼️しますが、内容をよく確認しましょう。そして、このブログを読んでいる人は軍事利用の人はいないと思いますので「Civil(民間利用)」を選択して、画面下の「Submit」ボタンを押しましょう。

すると、SmartRF Flash programmerのZipファイルがダウンロードされます。

④インストール

ダウンロードしたZipファイルを解凍し「Setup_SmartRF_Flash_Programmer-1.12.8.exe」を実行してインストールします。

⑤ファームウェアのダウンロード

次に、CC2531のコーディネータ用ファームウェアCC2531_DEFAULT_20190608.zipをダウンロードします。ダウンロードが完了したら、zipを解凍しておきましょう。

⑥CC2531とCC Debuggerを接続

次に、CC2531 USBトグルとCC Debuggerを以下の図のように接続します。コネクタには向きがあるので十分に注意して接続して下さい。また、パソコンのUSBポートに挿す前に2つを接続しておく必要があります。

⑦PCに接続

CC2531 USBトグルとCC DebuggerのUSBポートを、両方ともPCに接続します。正常に接続されると、CC Debuggerのランプが緑色に光るので確認して下さい。

⑧ファームウェアの書き換え

SmartRF Flash programmerを起動し、Flash Imageの選択で、ダウンロードした「CC2531ZNP-Prod.hex」を選択します。そして「Retain IEEE・・・」のチェックを外し、Actionから「Erase. program and verify」を選択して、「Perform action」ボタンをクリックします。

⑨書き換え確認

1分ほど待っていると、以下の画像のように「CC2531- ID0100: Erase. program and verify OK」と表示され、ファームウェアの書き換えが完了します。

Node-redのインストール

ここからは、Raspberry PiにNode-redをインストールしていきます。なお、Raspberry PiへのRaspberry Pi OS(旧Raspbian)のインストール手順は、あちこちに情報があるので省略します。今回は、Raspberry Pi OS (32-bit) with desktopの2020-05-27を利用しました。

※CC2531USBトグルは、後でRaspberry Piに接続するので、まだ挿さないで下さい。

①Node-redのインストール

Mode-redのインストールは簡単で、「bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)」のコマンドを実行するだけです。これで必要なモジュールとNode-redがダウンロードされインストールされます。インストールには、大体10分ぐらいかかるので、トイレ休憩にしましょう🚻

pi@raspberrypi:~ $ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
 
Are you really sure you want to do this ? [y/N] ? y  <--yを入力

Would you like to install the Pi-specific nodes ? [y/N] ? y  <--yを入力

Running Node-RED install for user pi at /home/pi on raspbian

This can take 20-30 minutes on the slower Pi versions - please wait.

  Stop Node-RED                       ✔
  Remove old version of Node-RED      ✔
  Remove old version of Node.js       ✔
  Install Node.js LTS                 ✔   Node v12.18.0   Npm 6.14.5
  Clean npm cache                     ✔
  Install Node-RED core               ✔   1.0.6 
  Move global nodes to local          -
  Install extra Pi nodes              ✔
  Npm rebuild existing nodes          -
  Add shortcut commands               ✔
  Update systemd script               ✔
                                      

Any errors will be logged to   /var/log/nodered-install.log
All done.
  You can now start Node-RED with the command  node-red-start
  or using the icon under   Menu / Programming / Node-RED
  Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880

Started  2020年  6月 10日 水曜日 07:37:30 JST  -  Finished  2020年  6月 10日 水曜日 07:47:18 JST

②自動起動の設定

インストールが完了したら、Raspberry Piの起動時にNode-redが自動起動するように、Systemdに登録しておきます。

pi@raspberrypi:~ $ sudo systemctl enable nodered.service
Created symlink /etc/systemd/system/multi-user.target.wants/nodered.service → /lib/systemd/system/nodered.service.

③Node-redの起動

それでは、Node-redを起動しましょう。

pi@raspberrypi:~ $ sudo systemctl start nodered.service
pi@raspberrypi:~ $

④静的Webサーバの有効化

次に、後でスマートフォン用のHTML画面を作成するために、Node-redの静的Webサーバ機能を有効にします。「~/.node-red/」にある「setting.js」をバックアップして開きます。

pi@raspberrypi:~ $ cd .node-red/
pi@raspberrypi:~/.node-red $ cp settings.js settings.js.org
pi@raspberrypi:~/.node-red $ vi settings.js

次に、setting.js内の「httpRoot」のコメントアウトと「httpStatic」のコメントアウトを外し、「httpStatic」のパスを「/home/pi/node-red-static/」に書き換えます。

    // The following property can be used in place of 'httpAdminRoot' and 'httpNodeRoot',
    // to apply the same root to both parts.                                              
    httpRoot: '/red',

    // When httpAdminRoot is used to move the UI to a different root path, the            
    // following property can be used to identify a directory of static content           
    // that should be served at http://localhost:1880/.                                   
    httpStatic: '/home/pi/node-red-static/',

このように設定することで「/home/pi/node-red-static/」に格納したHTMLファイルなどを静的Webサーバとしてブラウザに表示できるようになります。

⑤テスト用HTMLの作成

静的Webサーバの動作を確認するために「/home/pi/node-red-static/」にテスト用のindex.htmlを作成します。

pi@raspberrypi:~/.node-red $ cd
pi@raspberrypi:~ $ mkdir node-red-static
pi@raspberrypi:~ $ cd node-red-static/
pi@raspberrypi:~/node-red-static $ echo "<html><body>test</body></html>" > index.html

⑥Node-redの再起動

設定が完了したらnode-redを再起動しましょう。

pi@raspberrypi:~/.node-red $ sudo systemctl restart nodered.service
pi@raspberrypi:~/.node-red $

⑦Node-redの確認

それでは、PCのWebブラウザから「http://<Raspberry PiのIPアドレス>:1880/」にアクセスしましょう。以下のように、先ほど作成したindex.htmlが表示されればOKです。

次に「http://<Raspberry PiのIPアドレス>:1880/red/」にアクセスしてみましょう。以下のように、おなじみのNode-redの画面が表示されればOKです。

これでNode-redのインストールは完了です。

Mosquittoのインストール

次に、zigbee2mqttサーバに必要なMQTTブローカをインストールします。今回はMosquittoを利用することにします。

①Mosquittoのインストール

まずは、aptコマンドを入力して、Mosquittoをインストールします。

pi@raspberrypi:~/.node-red $ sudo apt install mosquitto mosquitto-clients

②自動起動の設定

インストールできたら、Raspberry pi起動時に自動起動するように設定します。

pi@raspberrypi:~/.node-red $ sudo systemctl enable mosquitto
Synchronizing state of mosquitto.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable mosquitto

③Mosquittoの起動

それでは、Mosquittoを起動してみましょう。

pi@raspberrypi:~/.node-red $ sudo systemctl start mosquitto

④Mosquitoの動作確認

Mosquitoが起動したら、ちゃんとMQTT通信ができるか確認します。まずは、コンソールを2つ開いて下さい。

1つ目のコンソールで以下のように、メッセージを受信するMQTT Sebscriverを起動します。

pi@raspberrypi:~/.node-red $ mosquitto_sub -d -t test
Client mosqsub|10140-raspberry sending CONNECT
Client mosqsub|10140-raspberry received CONNACK (0)
Client mosqsub|10140-raspberry sending SUBSCRIBE (Mid: 1, Topic: test, QoS: 0)
Client mosqsub|10140-raspberry received SUBACK
Subscribed (mid: 1): 0

2つ目のコンソールで以下のように、MQTTメッセージを送信します。

pi@raspberrypi:~ $ mosquitto_pub -d -t test -m "TEST MESSAGE"
Client mosqpub|10388-raspberry sending CONNECT
Client mosqpub|10388-raspberry received CONNACK (0)
Client mosqpub|10388-raspberry sending PUBLISH (d0, q0, r0, m1, 'test', ... (12 bytes))
Client mosqpub|10388-raspberry sending DISCONNECT
pi@raspberrypi:~ $ 

すると、一つ目のコンソールに以下のように、送信したメッセージが表示されるはずです。

Client mosqsub|10140-raspberry received PUBLISH (d0, q0, r0, m0, 'test', ... (12 bytes))
TEST MESSAGE

これでMosquittoのインストールと動作確認は、完了です‼️

CC2531 USBトグルの接続

ここからは、CC2531 USBトグルをRaspberry Piに接続して、動作確認をおこないます。

①USBトグルの接続

ファームウェアを書き換えたCC2531 USBトグルをRaspberry PiのUSBポートに挿します。ちなみに、USB3.0対応ポートでも、非対応ポートでもどこでもOKです。

②dmesgで確認

USBトグルをUSBポートに差し込んだら、dmesgコマンドで確認します。正常に認識されると、以下のように「Product: TI CC2531 USB CDC」として認識されます。

pi@raspberrypi:~/.node-red $ dmesg 
[ 6906.824925] usb 1-1.4: new full-speed USB device number 3 using xhci_hcd
[ 6906.974390] usb 1-1.4: New USB device found, idVendor=0451, idProduct=16a8, bcdDevice= 0.09
[ 6906.974406] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6906.974418] usb 1-1.4: Product: TI CC2531 USB CDC
[ 6906.974430] usb 1-1.4: Manufacturer: Texas Instruments
[ 6906.974442] usb 1-1.4: SerialNumber: __0X00124B0014D99402
[ 6907.058775] cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device
[ 6907.060137] usbcore: registered new interface driver cdc_acm
[ 6907.060143] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

③lsusbで確認

次に、lsusbコマンドで確認します。Bus 001 Device 003として認識されています。

pi@raspberrypi:~/.node-red $ 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

④シリアルポートの確認

次に、シリアルポートを確認します。以下のように「/dev/ttyACM0」が存在していればOkです。ちなみに「ls -l /dev/serial/by-id」とすると「/dev/ttyACM0」に接続している機器名も確認できます。

pi@raspberrypi:~/.node-red $ ls -l /dev/ttyACM0 
crw-rw---- 1 root dialout 166, 0  6月 10 22:31 /dev/ttyACM0
pi@raspberrypi:~/.node-red $ ls -l /dev/serial/by-id
合計 0
lrwxrwxrwx 1 root root 13  6月 10 22:31 usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0014D99402-if00 -> ../../ttyACM0
pi@raspberrypi:~/.node-red $

以上のように、ちゃんとCC2531が認識されていればOKです。ここまでで、Zigbee Hub作成の事前準備は終わりです。

おわりに

今回は、Raspberry Piを用いたZigbee Hubの実現に向けて、CC2531のファームウェアの書き換え、Raspberry PiへのNode-redとMosquittoのインストール、CC2531の接続確認を行いました。次回は、zigbee2mqttサーバをインストールし、zigbee機器とNode-redを用いて通信できるようにしてみたいと思います。

■実現に向けた連載
 第1回:CC2531とRaspberry Piの準備
 第2回:zigbee2mqttサーバのインストールとzigbee機器の接続  <–次はこれ
 第3回:スマホ&Alexaインタフェースの実装

※技適マークが無い機器を利用する場合は、Web申請をお忘れなく!

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム開発者向け
スポンサーリンク
naka-kazzをフォローする
スマートホーム×DIY

コメント

  1. CC Debuggerのリボンケーブルは赤ラインを1番ピンに合わせたほうが間違いにくいのではないでしょうか
    USBドングルにも1番と10番のシルク印刷があります

    • コメントありがとうございます。確かにそうですね。次やるときは赤線意識します!