ZigbeeCoordinator

From RevSpace
Revision as of 20:48, 14 March 2019 by Bertrik Sikken (talk | contribs) (→‎Software)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Project ZigbeeCoordinator
Cc2531.jpg
Flashing a CC2531 USB dongle with Zigbee coordinator firmware
Status Completed
Contact bertrik
Last Update 2019-03-14

What is it

This page describes the steps I performed to flash a generic CC2531 USB stick with firmware to make it act as a Zigbee coordinator. Zigbee is a wireless protocol to communicate with wireless appliances in your home, for example Ikea TRADFRI lamps.

Stuff to investigate:

  • Can we run the CCLib flash programming proxy on an STM32 microcontroller? It has 3.3V voltage levels, uses a fast (virtual) serial port, so flashing should be faster than with a Wemos D1.

-> at least it compiles easily with platformio!

  • Is it possible to combine the data-in/data-out pins on the Arduino programming software? This would remove the need for connecting data-in/data-out together on a breadboard

Hardware and updating the firmware

I ordered this CC2531 stick plus the debug connector.

By default, the stick shows up in the system log as follows:

 [58101.234023] usb 1-3: New USB device found, idVendor=0451, idProduct=16ae, bcdDevice= 1.17
 [58101.234030] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
 [58101.234033] usb 1-3: Product: CC2531 USB Dongle
 [58101.234037] usb 1-3: Manufacturer: Texas Instruments

It was connected to an ESP8266 Wemos D1 mini for re-programming.

I followed these instructions.

I wired this up as follows:

  • press the flatcable onto the stick, with the red wire away from the USB connector
  • press the flatcable onto the programming adapter, with the red wire towards pin 1

Wiring up:

  • Wemos D1 pin GND -> breadboard -> adapter GND (pin 1)
  • Wemos D1 pin D8 -> breadboard -> adapter RESETn (pin 7)
  • Wemos D1 pin D7 -> breadboard -> adapter DC (pin 3)
  • Wemos D1 pin D6 -> breadboard -> adapter DD (pin 4)
  • Wemos D1 pin D5 -> breadboard connected to D6!

I downloaded the CCLib toolchain from GitHub and made the following changes:

diff --git a/Arduino/CCLib/Examples/CCLib_proxy/CCLib_proxy.ino b/Arduino/CCLib/Examples/CCLib_proxy/CCLib_proxy.ino
index 1ba6949..b47d4da 100644
--- a/Arduino/CCLib/Examples/CCLib_proxy/CCLib_proxy.ino
+++ b/Arduino/CCLib/Examples/CCLib_proxy/CCLib_proxy.ino
@@ -35,10 +35,10 @@
 ////////////////////////////////////////
 
 // Pinout configuration (Configured for Arduino Leonardo)
-int CC_RST   = 5;
-int CC_DC    = 4;
-int CC_DD_I  = 3;
-int CC_DD_O  = 2;
+int CC_RST   = D8;
+int CC_DC    = D7;
+int CC_DD_I  = D6;
+int CC_DD_O  = D5;
 
 // Change this if you are using an external led
 int LED      = LED_BUILTIN;

Then enter the CCLib/Python directory and try to see if the programming tool can find the USB stick (the -E argument proved critical for me, it wouldn't find the stick without it):

 ./cc_info.py -E

If it's found, you should see all kinds of information about the CC2531.

TODO document:

  • download the HEX file
  • edit the HEX file
  • command to program the HEX file
  • ask for patience
NOTE: Performing auto-detection (use -p to specify port manually)
INFO: Checking /dev/ttyUSB0
INFO: Found a CC2531 chip on /dev/ttyUSB0

Chip information:
      Chip ID : 0xb524
   Flash size : 256 Kb
    Page size : 2 Kb
    SRAM size : 8 Kb
          USB : Yes
Sections in /home/bertrik/code/zigbee2mqtt/temp/CC2531ZNP-Prod.hex:

 Addr.    Size
-------- -------------
 0x0000   8176 B 
 0x1ff6   10 B 
 0x3fff0   1 B 
 0x2000   239616 B 

This is going to ERASE and REPROGRAM the chip. Are you sure? <y/N>:  y

Flashing:
 - Chip erase...
 - Flashing 4 memory blocks...
 -> 0x0000 : 8176 bytes 
    Progress 100%... OK
 -> 0x1ff6 : 10 bytes 
    Progress 100%... OK
 -> 0x3fff0 : 1 bytes 
    Progress 100%... OK
 -> 0x2000 : 239616 bytes 
    Progress 100%... OK

Completed

After flashing, the USB stick shows up as follows in the system log:

[64730.568699] usb 1-3: New USB device found, idVendor=0451, idProduct=16a8, bcdDevice= 0.09
[64730.568706] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[64730.568710] usb 1-3: Product: TI CC2531 USB CDC
[64730.568714] usb 1-3: Manufacturer: Texas Instruments
[64730.568717] usb 1-3: SerialNumber: __0X00124B0014B943EA
[64730.593932] cdc_acm 1-3:1.0: ttyACM0: USB ACM device
[64730.595428] usbcore: registered new interface driver cdc_acm
[64730.595434] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

Software

Zigbee2mqtt

Zigbee2mqtt talks to the Zigbee CC2530/2531 stick and bridges Zigbee events from devices to MQTT and vice vera.

This means you can get input from a device by subscribing to an MQTT topic. You can control a device by publishing to an MQTT topic.

On top of this, you can run home assistant or domoticz to get a fancy GUI.

Run:

 npm start

Examples

Turn the lamp on and off (with fade) over MQTT:

 mosquitto_pub -h stofradar.nl -t zigbee2mqtt/0x000b57fffe441844/set -m {\"state\":\"ON\"}
 mosquitto_pub -h stofradar.nl -t zigbee2mqtt/0x000b57fffe441844/set -m {\"state\":\"OFF\"}

Change the brightness (0-255):

 mosquitto_pub -h stofradar.nl -t zigbee2mqtt/0x000b57fffe441844/set -m {\"brightness\":1}
 mosquitto_pub -h stofradar.nl -t zigbee2mqtt/0x000b57fffe441844/set -m {\"brightness\":10}
 mosquitto_pub -h stofradar.nl -t zigbee2mqtt/0x000b57fffe441844/set -m {\"brightness\":255}

Change the color temperature (250-454, blueish-reddish) over MQTT:

 mosquitto_pub -h stofradar.nl -t zigbee2mqtt/0x000b57fffe441844/set -m {\"color_temp\":250}
 mosquitto_pub -h stofradar.nl -t zigbee2mqtt/0x000b57fffe441844/set -m {\"color_temp\":454}


Home assistant

Couldn't make it work in Home Assistant.

I tried to run it on my laptop, but to see it in full glory, you apparently need to run it on a Raspberry Pi. It does run partially on a laptop but some parts are not available (like the Add-on Store), so you can't just use the zigbee2mqtt plugin.

I find this software a bit confusing, and don't want to spend much time figuring out if I need "Home Automation", "hass", "hass.io", installing a special version of docker, etc.

Domoticz

Can be run on a regular laptop with Debian.

See also: https://www.domoticz.com/wiki/Zigbee2MQTT