Smart Home with Zigbee2mqtt: Using CC2531 USB Stick as ZigBee Coordinator

<rawat.s>
6 min readMar 12, 2020

--

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

บทความนี้นำเสนอขั้นตอนการนำอุปกรณ์ที่เรียกว่า CC2531 ZigBee USB Stick มาติดตั้งเฟิร์มแวร์ใหม่ ให้กลายเป็นอุปกรณ์ที่เรียกว่า ZigBee Coordinator และสามารถนำมาใช้ร่วมกับซอฟต์แวร์ Zigbee2mqtt เชื่อมต่อกับอุปกรณ์ Smart Home Devices ที่ใช้โปรโตคอลสื่อสารไร้สายแบบ ZigBee ได้หลายรุ่น

Zigbee2mqtt สำหรับการเชื่อมต่ออุปกรณ์ ZigBee

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

Zigbee2mqtt เป็นซอฟต์แวร์ประเภท Open Source พัฒนาด้วยภาษา Node.js โดยจะต้องใช้งานร่วมกับอุปกรณ์ USB Stick / USB Dongle ที่ใช้ชิปของบริษัท Texas Instrument (TI) เช่น CC2531 เพื่อทำหน้าที่เป็น ZigBee Coordinator หรือ ZigBee Hub / Gateway ช่วยให้อุปกรณ์ที่สื่อสารไร้สายด้วยโปรโตคอล ZigBee สามารถเข้ามาเชื่อมต่อในระบบเครือข่ายได้ จากนั้นก็จะส่งข้อมูลและสถานะต่าง ๆ ไปยัง MQTT Broker อีกต่อหนึ่งได้

ถ้าดูจากรายชื่ออุปกรณ์ Supported Devices ที่นำมาใช้กับ Zigbee2mqtt จะเห็นได้ว่า มีอุปกรณ์จำนวนมากหลายรุ่นจากหลายผู้ผลิตในตลาดปัจจุบัน (ณ เวลาที่เขียนบทความนี้)

“Currently 821 devices are supported from 144 different vendors.”

การติดตั้งเฟิร์มแวร์ลงใน CC2531 USB Stick เพื่อใช้งานร่วมกับ zigbee2mqtt

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

วิธีการติดตั้งเฟิร์มแวร์สำหรับชิป CC2531 ของ Texas Instrument (TI) ทำได้หลายวิธี ขึ้นอยู่กับว่า เราจะเลือกใช้ระบบปฏิบัติการใด เช่น Windows, Linux และ Mac OS X ผู้อ่านที่สนใจสามารถศึกษาเพิ่มเติมได้จากเอกสารออนไลน์ “Flashing the firmware on the CC2531 USB stick

รายการอุปกรณ์ที่ใช้

  1. SmartRF04EB Module หรือ CC-Debugger (เลือกใช้อันไหนก็ได้)
  2. CC2531 ZigBee USB Stick
Cable Adapter (ซ้ายมือ) อุปกรณ์ SmartRF04EB (กลาง) และ CC Debugger (ขวามือ) สำหรับ Firmware Flashing
ตัวอย่างโมดูล Low-Cost CC253x-based ZigBee

ขั้นตอนการดำเนินการ

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

  1. ดาวน์โหลดและติดตั้งโปรแกรม CC-Tool สำหรับ Ubuntu
  2. ดาวน์โหลดไฟล์ที่เป็นเฟิร์มแวร์สำหรับ Zigbee Router เพื่อนำมาใช้กับ zigbee2mqtt
  3. อัปโหลดไฟล์เฟิร์มแวร์ลงในชิป CC2531 ของโมดูล CC2531 ZigBee Sniffer USB Dongle

ในการเขียนเฟิร์มแวร์ใหม่ลงใน CC2531 USB Dongle แทนเฟิร์มแวร์เดิมที่ทำหน้าที่เป็น ZigBee Sniffer เราจะใช้โปรแกรมชื่อ CC-Tool (Open Source) สำหรับระบบปฏิบัติการ Linux (Ubuntu) โดยจะดาวน์โหลดซอร์สโค้ดแล้วนำมา Build เพื่อให้ได้โปรแกรมไว้ใช้งาน คำสั่งมีดังนี้ [อ้างอิง]

$ git clone https://github.com/dashesy/cc-tool.git
$ cd cc-tool
$ ./bootstrap
$ ./configure
$ make
$ sudo make install

ถ้าทำคำสั่งได้สำเร็จ เราจะได้โปรแกรมชื่อ cc-tool และลองทำคำสั่งเรียกใช้ดังนี้

$ cc-tool --help | head -2

เอาต์พุตที่ได้ เป็นดังนี้

Texas Instruments 8051-based System-On-Chip device programmer
Version: 0.26

ไฟล์ที่เป็นเฟิร์มแวร์ Z-Stack ซึ่งเป็น ZigBee Stack ของบริษัท Texas Instrument (TI) ทางผู้พัฒนา zigbee2mqtt ได้แชร์ไว้ใน Github ซึ่งจำแนกได้ดังนี้

  • จำแนกตามเวอร์ชัน เช่น 1.2 (ZigBee HA 1.2) และ 3.x (ZigBee 3.0)
  • จำแนกตามชิปที่ใช้ เช่น CC2530, CC2531 และ CC2530+CC2591/CC2592 (RF Power Amplifier) เป็นต้น
  • จำแนกตามฟังก์ชัน เช่น ZigBee Coordinator หรือ ZigBee Router
  • จำแนกตามจำนวนอุปกรณ์ (End Devices) ที่จะนำมาใช้งาน เช่น ในกรณีของ ZigBee Coordinator แบ่งเป็น “default” สำหรับใช้กับอุปกรณ์ที่มีจำนวนไม่มาก (ไม่เกิน 30) และถ้าจะใช้กับจำนวนอุปกรณ์ที่มากกว่านั้น ก็ควรเลือก ZigBee Coordinator ที่รองรับการทำงานแบบที่เรียกว่า “Source Routing”

ดังนั้นจึงต้องเลือกให้ตรงกับฮาร์ดแวร์และวัตถุประสงค์สำหรับการนำมาใช้งาน !!!

ในเบื้องต้น เราจะทดลองใช้ Z-Stack_Home_1.2 (default) และดาวน์โหลดไฟล์ CC2531_DEFAULT_20190608.zip

เมื่อดาวน์โหลดไฟล์ดังกล่าวมาแล้ว ให้ทำการแตกไฟล์ในไดเรกทอรีใหม่ดังนี้ ซึ่งจะได้ไฟล์ .hex และ .bin

$ unzip -d CC2531_DEFAULT_20190608 CC2531_DEFAULT_20190608.zip

เสียบอุปกรณ์ CC2531 USB Stick และ SmartRF04EB Programmer ตามลำดับ เข้ากับพอร์ต USB ของคอมพิวเตอร์ (ในกรณีที่ใช้ระบบปฏิบัติการ Ubuntu)

$ lsusb | grep -E "(Texas|Chipcon)"

ตัวอย่างเอาต์พุตจาก Console เมื่อทำคำสั่งแล้ว

Bus 001 Device 005: ID 11a0:eb20 Chipcon AS
Bus 001 Device 006: ID 0451:16a8 Texas Instruments, Inc.

แต่ถ้าใช้อุปกรณ์ CC2531 USB Stick และ CC Debugger จะได้เอาต์พุตดังนี้

Bus 001 Device 015: ID 0451:16b3 Texas Instruments, Inc.
Bus 001 Device 014: ID 0451:16a2 Texas Instruments, Inc.
ตัวอย่างอุปกรณ์ CC2531 USB Stick และ CC Debugger

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ข้อสังเกต: ถ้าไม่มีอุปกรณ์ SmartRF04EB หรือ CC Debugger ก็มีวิธีอื่น เช่น การใช้ Raspberry Pi 3 หรือ ESP8266 มาลงโปรแกรมเพื่อใช้งานแทนได้ ศึกษาได้จาก “Zigbee2mqtt > Alternative flashing methods

เริ่มขั้นตอน Firmware Flashing

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

กดปุ่มรีเซตที่อุปกรณ์ SmartRF04EB Programmer จากนั้นจะเห็น Green LED สว่างขึ้นที่โมดุล CC2531 USB Stick แล้วทำคำสั่งต่อไปนี้ เพื่อลบหน่วยความจำ (Chip Erase) และเขียนข้อมูลใหม่ลงไป (Flash Write)

$ cd CC2531_DEFAULT_20190608
$ sudo cc-tool -e -w CC2531ZNP-Prod.hex -v read

แต่ถ้าใช้อุปกรณ์ CC Debugger ก็ทำคำสั่งเหมือนกัน

[Optional] การใช้คำสั่ง CC-Tool สำหรับ Windows ร่วมกับ MSYS2-MINGW64

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ถ้าจะใช้โปรแกรม CC-Tool สำหรับระบบปฏิบัติการ Windows 10 และได้ติดตั้ง MSYS2 และ MinGW64 Toolchains ไว้แล้ว ก็สามารถใช้แทน Linux Ubuntu ได้ โดยจะต้องดาวน์โหลดซอร์สโค้ดมาทำคอมไพล์เอง นอกจากนั้นจะต้องเปลี่ยน USB Driver ที่ใช้กับอุกปกรณ์ CC Debugger ของผู้ผลิต แทนที่ด้วย WinUSB Driver ซึ่งทำได้ไม่ยากถ้าใช้โปรแกรม USBDriverTool.exe

ตัวอย่างการใช้โปรแกรม USB Driver Tool เพื่อเปลี่ยนไปใช้ WinUSB Driver สำหรับ CC Debugger
ตัวอย่างการทำคำสั่ง cc-tool.exe ผ่าน Terminal ของ MSYS2-MINGW64

หมายเหตุ: ถ้าใช้ระบบปฏิบัติการ Windows ก็มีอีกตัวเลือกหนึ่งคือ การใช้ซอฟต์แวร์ฟรีของ TI ที่มีชื่อว่า SmartRF Flash programmer ต้องเป็นเวอร์ชันเก่า v1.12.8 (31-May-2016) และไม่ใช่ SmartRF Flash Programmer v2

การติดตั้ง Nodejs v12 และ zigbee2mqtt สำหรับ Windows

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

มาถึงขั้นตอนนี้ เรามีอุปกรณ์ CC2531 USB Stick ที่ได้ติดตั้งเฟิรม์แวร์ได้แล้ว ถัดไปก็จะเป็นการติดตั้งโปรแกรม Zigbee2mqtt โดยใช้ nodejs และ npm

แต่ถ้าดูจากเอกสารออนไลน์ของผู้พัฒนา zigbee2mqtt จะเห็นว่า มีขั้นตอนติดตั้งใช้งาน zigbee2mqtt สำหรับบอร์ด Raspberry Pi 3 ที่ใช้ระบบปฏิบัติการ Raspbian อาจเป็นเพราะว่า ทางผู้พัฒนาต้องการสาธิตให้เห็นว่า สามารถใช้คอมพิวเตอร์บอร์ดเดียว (Single-Board Computer: SBC) มาทำหน้าที่เป็น ZigBee Coordinator และเชื่อมต่อกับ MQTT Broker ได้

อย่างไรก็ตามในบทความนี้ จะลองใช้ zigbee2mqtt และ nodejs ที่ได้ติดตั้งใช้งานสำหรับระบบปฏิบัติการ Windows 10 (64-bit) เพื่อสาธิตและทดสอบดูว่า อุปกรณ์ CC2531 USB Stick ได้เราได้ติดตั้งเฟิร์มแวร์ไปแล้วนั้น สามารถทำงานได้จริง

ขั้นตอนการดำเนินการ

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

  1. ติดตั้ง Nodejs สำหรับ Windows 10 (ถ้ายังไม่เคยได้ติดตั้งใช้งานในระบบ)
  2. ติดตั้ง Git for Windows (ถ้ายังไม่เคยได้ติดตั้งใช้งานในระบบ)
  3. ดาวน์โหลด Repository ของ zigbee2mqtt จาก Github โดยใช้คำสั่ง git
  4. เปิดใช้งาน Git CMD ทำคำสั่งเพื่อติดตั้ง Nodejs packages ต่าง ๆ สำหรับ zigbee2mqtt
  5. ตั้งค่าการใช้งานและเริ่มเปิดใช้งาน zigbee2mqtt
หน้าเว็บสำหรับดาวน์โหลด Nodejs v12.x

ทำคำสั่งต่อไปนี้

$ git clone https://github.com/Koenkk/zigbee2mqtt.git
$ cd zigbee2mqtt
$ npm ci

แก้ไขไฟล์ data/configuration.yml เพื่อระบุ IP Address หรือ Host Name สำหรับ MQTT Broker ที่เราต้องการใช้งาน และ Serial Port ที่เชื่อมต่อกับอุปกรณ์ CC2531 USB Stick (USB CDC Class)

ตัวอย่างการตั้งค่าสำหรับ zigbee2mqtt เป็นดังนี้

homeassistant: falsepermit_join: truemqtt:
base_topic: zigbee2mqtt
### specify the IP address or hostname of your MQTT broker
server: 'mqtt://x.x.x.x:1883'
#user: xxxx
#password: xxxxxx
serial:
## specify the serial COM port (CC2531 USB stick)
port: COM61

ข้อสังเกต:

  1. ในเบื้องต้น เราตั้งค่า permit_join เป็น true เพื่อให้อุปกรณ์อื่น ๆ เข้ามาเชื่อมต่อกับอุปกรณ์ ZigBee Coordinator ของเราได้ แต่ถ้านำไปใช้งานจริง ควรจะตั้งค่าเป็น false เพื่อป้องกันอุปกรณ์ที่ไม่เกี่ยวข้อง หรือไม่ได้รับอนุญาตเข้ามาร่วมในเครือข่าย ZigBee (PAN)
  2. การเชื่อมต่อไปยัง MQTT Broker มีหลายรูปแบบ เช่น มีการระบุผู้ใช้หรือรหัสผ่านหรือไม่ (User Authentication) และมีการเข้ารหัสเพื่อความปลอดภัยหรือไม่ตามรูปแบบของ TLS
  3. ตัวเลือกและการตั้งค่าสำหรับ Zigbee2mqtt สามารถศึกษาเพิ่มเติมได้จาก Zigbee2mqtt Configuration

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

จากนั้นให้ทำคำสั่งต่อไปนี้ เพื่อเริ่มต้นใช้งาน zigbee2mqtt

$ npm start

อุปกรณ์ ZigBee Device ที่ได้ลองนำมาทดสอบและสามารถใช้ได้กับ zigbee2mqtt คือ Xiaomi WSDCGQ01LM Mijia เป็นอุปกรณ์ Smart Temperature and Humidity Sensor ที่สามารถวัดความชื้นสัมพัทธ์และอุณหภูมิในอากาศได้

อุปกรณ์ ZigBee Device: Xiaomi WSDCGQ01LM Mijia

เมื่อรันคำสั่ง npm start และ zigbee2mqtt เริ่มทำงานแล้ว ถ้ากดปุ่ม Reset Button ของอุปกรณ์ Xiaomi Mijia ค้างไว้ประมาณ 5 วินาที จะเห็นแสงไฟ LED สีฟ้า (Blue LED) สว่างขึ้นแล้วกระพริบช้า นั่นแสดงว่า อุปกรณ์กำลังเริ่มจับคู่ (Pairing) และค้นหาอุปกรณ์ ZigBee Coordinator ที่อยู่รอบ ๆ

ตัวอย่างข้อความเอาต์พุตขณะที่ Zigbee2mqtt กำลังงานและมีอุปกรณ์เข้ามาเชื่อมต่อ

ข้อสังเกต: อุปกรณ์ Xiaomi WSDCGQ01LM จะส่งข้อมูลเมื่อกดปุ่มรีเซตหนึ่งครั้ง หรือเมื่อมีการเปลี่ยนแปลงอุณหภูมิหรือความชื้นสัมพัทธ์ภายนอก เพื่อหลีกเลี่ยงการส่งข้อมูลบ่อย ๆ โดยไม่จำเป็น ซึ่งจะทำให้เปลืองแบตเตอรี (ใช้แบตเตอรีแบบ Coin Cell)

ตัวอย่างโค้ด Python เพื่อเชื่อมต่อไปยัง MQTT Broker และรับข้อมูลจาก Zigbee2mqtt

ถัดไปลองมาดูตัวอย่างโค้ด Python เพื่อนำมาสาธิตการเชื่อมต่อไปยัง MQTT Broker เพื่อให้คอยรับข้อมูล (MQTT Subscription) ภายใต้หัวข้อ zigbee2mqtt เช่น เมื่ออุปกรณ์เซนเซอร์ส่งข้อมูลไปยัง MQTT broker เราก็จะสามารถรับ MQTT Payload มาแสดงเป็นข้อมูลแบบ JSON ได้

ข้อสังเกต: โค้ด Python นี้ใช้ไลบรารี paho-mqtt

#!/usr/bin/env pythonimport paho.mqtt.client as mqtt
import sys, time
import json
mqtt_hostname = "x.x.x.x"
mqtt_port = 1883
auth_user = 'xxxxxxxx'
auth_pass = 'xxxxxxxx'
def message_cb(client, userdata, msg):
print( "MQTT message received..." )
topic = str(msg.topic)
json_str = str(msg.payload.decode("utf-8","ignore"))
json_data = json.loads( json_str )
# dump JSON data
print( json.dumps(json_data) )
if topic.startswith('zigbee2mqtt/0x0'):
dev_id = topic.split('/')[1]
print( "Sensor data for '{}'".format( dev_id ) )
if 'battery' in json_data:
batt = json_data['battery']
print( "Battery Level: {:d} %".format(batt) )
if 'voltage' in json_data:
volt = json_data['voltage']
print( "Voltage: {:.3f} V".format(volt/1000.0) )
if 'temperature' in json_data:
temp = json_data['temperature']
print( "Temperature: {:.2f} deg.C".format( temp ) )
if 'humidity' in json_data:
humid = json_data['humidity']
print( "Humidity: {:.2f} %RH".format( humid ) )
if 'pressure' in json_data:
press = json_data['pressure']
print( "Air Pressure: {:.1f} hPa".format( press) )
if 'linkquality' in json_data:
lqi = json_data['linkquality']
def publish_cb(client, userdata, mid):
print ("message published...", str(mid) )
def subscribe_cb(client, userdata, mid, qos):
print ("client subscribed...")
def connect_cb(client, userdata, flags, rc):
print ("client connected")
time.sleep(1.0)
client.subscribe("zigbee2mqtt/#", qos=1)
client = mqtt.Client( 'paho-mqtt-zigbee2mqtt' )
client.on_message = message_cb
client.on_publish = publish_cb
client.on_subscribe = subscribe_cb
client.on_connect = connect_cb
client.username_pw_set( auth_user, auth_pass )
client.connect( mqtt_hostname, mqtt_port, 60 )
try:
while True:
client.loop()
time.sleep(0.5)
except KeyboardInterrupt:
print ( 'Terminated....' )
print ( 'Done' )###################################################################
ตัวอย่างข้อความเอาต์พุตจาก Python Test Script

[เพิ่มเติม] ข้อมูลเชิงเทคนิคเกี่ยวกับการเชื่อมต่อสายระหว่างอุปกรณ์ TI CC2531 และ CC Debugger

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

Pin Layout & CC Debugger and CC2531 Wiring

  • Pin 1: GND — Gnd Pin on CC2531
  • Pin 2: Target Voltage Sense — N.C.
  • Pin 3: DC (Debug Clock) — P2.2 Pin on CC2531
  • Pin 4: DD (Debug Data) — P2.1 Pin on CC2531
  • Pin 5: CSn (Chip Select, Active-Low) — N.C.
  • Pin 6: SCLK (SPI Clock) — N.C.
  • Pin 7: RESETn (Reset, Active-Low) — /RST Pin on CC2531
  • Pin 8: MOSI (SPI Data Out) — N.C.
  • Pin 9: VCC — 3.3V Pin on CC2531
  • Pin 10: MISO (SPI Data In) — N.C.
Pin Layout for TI CC Debugger / SmartRF04EB (2x5 Pin Headers)

โดยสรุป เราได้เตรียมอุปกรณ์และติดตั้ง Zigbee2mqtt โดยใช้เครื่องคอมพิวเตอร์ Windows และใช้งานร่วมกับ CC2531 USB Stick ให้ทำงานเป็น Zigbee Coordinator และเชื่อมต่อไปยัง MQTT Broker ได้สำเร็จ สามารถเชื่อมต่ออุปกรณ์ Xiaomi WSDCGQ01LM Zigbee Device เป็นตัวอย่าง แต่ถ้ามีอุปกรณ์อื่น ๆ ก็สามารถนำมาลองเชื่อมต่อได้

--

--

<rawat.s>
<rawat.s>

Written by <rawat.s>

I'm Thai and working in Bangkok/Thailand.

No responses yet