项目作者: dyrkin

项目描述 :
ZigBee hub
高级语言: Go
项目地址: git://github.com/dyrkin/zigbee-steward.git
创建时间: 2019-02-13T00:15:14Z
项目社区:https://github.com/dyrkin/zigbee-steward

开源协议:MIT License

下载


ZigBee-Steward

Build Status

Overview

Bla bla bla

Example

In this example, we are going to send toggle command to IKEA TRÅDFRI bulb using Xiaomi Aqara Wireless Remote Switch.
To prepare, follow the steps:

  1. Connect ZigBee stick cc2531 to USB;
  2. Flash it using instruction: https://www.zigbee2mqtt.io/getting_started/flashing_the_cc2531.html;
  3. Run the example;
  4. Pair IKEA TRÅDFRI bulb by repeating 6 ONs and 5 OFFs one by one (ON -> OFF, ON -> OFF, ON -> OFF, ON -> OFF, ON -> OFF, ON);
  5. Pair Xiaomi Aqara Wireless Remote Switch by holding the button for ~10 seconds until blue LEDs start blinking.

Now you can toggle the bulb using the remote switch. Just click on it.

  1. import (
  2. "fmt"
  3. "github.com/davecgh/go-spew/spew"
  4. "github.com/dyrkin/zcl-go/cluster"
  5. "github.com/dyrkin/zigbee-steward"
  6. "github.com/dyrkin/zigbee-steward/configuration"
  7. "github.com/dyrkin/zigbee-steward/model"
  8. "sync"
  9. )
  10. //simple device database
  11. var devices = map[string]*model.Device{}
  12. func main() {
  13. conf := configuration.Default()
  14. conf.PermitJoin = true
  15. stewie := steward.New(conf)
  16. eventListener := func() {
  17. for {
  18. select {
  19. case device := <-stewie.Channels().OnDeviceRegistered():
  20. saveDevice(device)
  21. case device := <-stewie.Channels().OnDeviceUnregistered():
  22. deleteDevice(device)
  23. case device := <-stewie.Channels().OnDeviceBecameAvailable():
  24. saveDevice(device)
  25. case deviceIncomingMessage := <-stewie.Channels().OnDeviceIncomingMessage():
  26. fmt.Printf("Device received incoming message:\n%s", spew.Sdump(deviceIncomingMessage))
  27. toggleIkeaBulb(stewie, deviceIncomingMessage)
  28. }
  29. }
  30. }
  31. go eventListener()
  32. stewie.Start()
  33. infiniteWait()
  34. }
  35. func toggleIkeaBulb(stewie *steward.Steward, message *model.DeviceIncomingMessage) {
  36. if isXiaomiButtonSingleClick(message) {
  37. if ikeaBulb, registered := devices["TRADFRI bulb E27 W opal 1000lm"]; registered {
  38. toggleTarget(stewie, ikeaBulb.NetworkAddress)
  39. } else {
  40. fmt.Println("IKEA bulb is not available")
  41. }
  42. }
  43. }
  44. func toggleTarget(stewie *steward.Steward, networkAddress string) {
  45. go func() {
  46. stewie.Functions().Cluster().Local().OnOff().Toggle(networkAddress, 0xFF)
  47. }()
  48. }
  49. func isXiaomiButtonSingleClick(message *model.DeviceIncomingMessage) bool {
  50. command, ok := message.IncomingMessage.Data.Command.(*cluster.ReportAttributesCommand)
  51. return ok && message.Device.Manufacturer == "LUMI" &&
  52. message.Device.Model == "lumi.remote.b186acn01\x00\x00\x00" &&
  53. isSingleClick(command)
  54. }
  55. func isSingleClick(command *cluster.ReportAttributesCommand) bool {
  56. click, ok := command.AttributeReports[0].Attribute.Value.(uint64)
  57. return ok && click == uint64(1)
  58. }
  59. func saveDevice(device *model.Device) {
  60. fmt.Printf("Registering device:\n%s", spew.Sdump(device))
  61. devices[device.Model] = device
  62. }
  63. func deleteDevice(device *model.Device) {
  64. fmt.Printf("Unregistering device:\n%s", spew.Sdump(device))
  65. delete(devices, device.Model)
  66. }
  67. func infiniteWait() {
  68. wg := &sync.WaitGroup{}
  69. wg.Add(1)
  70. wg.Wait()
  71. }

Full examples