diff --git a/xaal.go b/xaal.go index 90561a3e2fee427cb0e5484402c956c7b6fee2ca..6aebc587d25c368e1a65522f4f7f865672b06b00 100644 --- a/xaal.go +++ b/xaal.go @@ -11,8 +11,11 @@ import ( "gitlab.imt-atlantique.fr/xaal/code/go/core/xaal" ) +// This is a xaal.Device w/ Z2MDevice and Expose type XAALDevice struct { *xaal.Device + Z2MDevice *Z2MDevice + Expose *Expose } type Contact struct { @@ -37,8 +40,6 @@ type Battery struct { type PowerRelay struct { XAALDevice - Expose Expose - Z2MDevice Z2MDevice } type PowerMeter struct { @@ -47,12 +48,10 @@ type PowerMeter struct { type Lamp struct { XAALDevice - Z2MDevice Z2MDevice } type ButtonRemote struct { XAALDevice - Z2MDevice Z2MDevice } type XAALDeviceInterface interface { @@ -60,7 +59,8 @@ type XAALDeviceInterface interface { getXAALDevice() *xaal.Device } -func (dev *XAALDevice) setup(zDev *Z2MDevice) { +func (dev *XAALDevice) setup() { + zDev := dev.Z2MDevice dev.VendorID = zDev.Definition.Vendor dev.ProductID = zDev.Definition.Model dev.HWID = zDev.IeeeAddress @@ -75,9 +75,9 @@ func (dev *XAALDevice) getXAALDevice() *xaal.Device { // ============================================================================= // Contact // ============================================================================= -func NewContact(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface { - dev := &Contact{XAALDevice{schemas.NewContact(addr)}} - dev.setup(zDev) +func NewContact(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &Contact{XAALDevice{schemas.NewContact(addr), zDev, exp}} + dev.setup() return dev } @@ -91,9 +91,9 @@ func (dev *Contact) update(payload map[string]interface{}) { // ============================================================================= // Thermometer // ============================================================================= -func NewThermometer(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface { - dev := &Thermometer{XAALDevice{schemas.NewThermometer(addr)}} - dev.setup(zDev) +func NewThermometer(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &Thermometer{XAALDevice{schemas.NewThermometer(addr), zDev, exp}} + dev.setup() return dev } @@ -107,9 +107,9 @@ func (dev *Thermometer) update(payload map[string]interface{}) { // ============================================================================= // Hygrometer // ============================================================================= -func NewHygrometer(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface { - dev := &Hygrometer{XAALDevice{schemas.NewHygrometer(addr)}} - dev.setup(zDev) +func NewHygrometer(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &Hygrometer{XAALDevice{schemas.NewHygrometer(addr), zDev, exp}} + dev.setup() return dev } @@ -123,9 +123,9 @@ func (dev *Hygrometer) update(payload map[string]interface{}) { // ============================================================================= // LinkQuality // ============================================================================= -func NewLinkQuality(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface { - dev := &LinkQuality{XAALDevice{schemas.NewLinkquality(addr)}} - dev.setup(zDev) +func NewLinkQuality(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &LinkQuality{XAALDevice{schemas.NewLinkquality(addr), zDev, exp}} + dev.setup() dev.RemoveAttribute("devices") dev.UnsupportedAttributes = []string{"devices"} return dev @@ -142,9 +142,9 @@ func (dev *LinkQuality) update(payload map[string]interface{}) { // ============================================================================= // Battery // ============================================================================= -func NewBattery(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface { - dev := &Battery{XAALDevice{schemas.NewBattery(addr)}} - dev.setup(zDev) +func NewBattery(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &Battery{XAALDevice{schemas.NewBattery(addr), zDev, exp}} + dev.setup() dev.RemoveAttribute("devices") dev.UnsupportedAttributes = []string{"devices"} return dev @@ -161,11 +161,11 @@ func (dev *Battery) update(payload map[string]interface{}) { // PowerRelay // ============================================================================= func NewPowerRelay(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { - dev := &PowerRelay{XAALDevice{schemas.NewPowerrelayToggle(addr)}, *exp, *zDev} + dev := &PowerRelay{XAALDevice{schemas.NewPowerrelayToggle(addr), zDev, exp}} dev.SetMethod("turn_on", dev.On) dev.SetMethod("turn_off", dev.Off) dev.SetMethod("toggle", dev.Toggle) - dev.setup(zDev) + dev.setup() return dev } @@ -208,9 +208,9 @@ func (dev *PowerRelay) Toggle(xaal.MessageBody) *xaal.MessageBody { // ============================================================================= // PowerMeter // ============================================================================= -func NewPowerMeter(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface { - dev := &PowerMeter{XAALDevice{schemas.NewPowermeter(addr)}} - dev.setup(zDev) +func NewPowerMeter(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &PowerMeter{XAALDevice{schemas.NewPowermeter(addr), zDev, exp}} + dev.setup() dev.RemoveAttribute("devices") dev.UnsupportedAttributes = []string{"devices"} return dev @@ -232,23 +232,23 @@ func (dev *PowerMeter) update(payload map[string]interface{}) { // ============================================================================= // Lamp // ============================================================================= -func NewLamp(addr uuid.UUID, zDev *Z2MDevice, expose *Expose) XAALDeviceInterface { +func NewLamp(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { // This is the default lamp device, we will change it's devType if needed - dev := &Lamp{XAALDevice{schemas.NewLamp(addr)}, *zDev} + dev := &Lamp{XAALDevice{schemas.NewLamp(addr), zDev, exp}} dev.SetMethod("turn_on", dev.turnOn) dev.SetMethod("turn_off", dev.turnOff) dev.SetMethod("toggle", dev.toggle) - if expose.GetFeature("brightness") != nil { + if exp.GetFeature("brightness") != nil { dev.DevType = "lamp.dimmer" dev.AddAttribute("brightness", 0) dev.AddMethod("set_brightness", dev.setBrightness) } - if expose.GetFeature("color_temp") != nil { + if exp.GetFeature("color_temp") != nil { dev.DevType = "lamp.dimmer" dev.AddAttribute("white_temperature", 0) dev.AddMethod("set_white_temperature", dev.setWhiteTemperature) } - if expose.GetFeature("color_xy") != nil { + if exp.GetFeature("color_xy") != nil { dev.DevType = "lamp.color" dev.AddAttribute("hsv", []float64{0, 0, 0}) dev.AddAttribute("mode", nil) @@ -256,7 +256,7 @@ func NewLamp(addr uuid.UUID, zDev *Z2MDevice, expose *Expose) XAALDeviceInterfac dev.AddMethod("set_hsv", dev.setHSV) dev.AddMethod("set_mode", dev.setMode) } - dev.setup(zDev) + dev.setup() return dev } @@ -410,9 +410,9 @@ func (dev *Lamp) setMode(body xaal.MessageBody) *xaal.MessageBody { // ============================================================================= // NetButtonRemote // ============================================================================= -func NewButtonRemote(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface { - dev := &ButtonRemote{XAALDevice{schemas.NewButtonRemote(addr)}, *zDev} - dev.setup(zDev) +func NewButtonRemote(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &ButtonRemote{XAALDevice{schemas.NewButtonRemote(addr), zDev, exp}} + dev.setup() dev.SetMethod("get_buttons", dev.GetButtons) return dev } diff --git a/z2m.go b/z2m.go index 5c65516b457a136fca3cfd4769a93866b365091e..b1adcef1bffeccfd563933c3313b0d8ea3c1e777 100644 --- a/z2m.go +++ b/z2m.go @@ -111,7 +111,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) { grpAdd, _ := baseAddr.Add(int64(0xff)) var dev XAALDeviceInterface - deviceMap := map[string]func(uuid.UUID, *Z2MDevice) XAALDeviceInterface{ + deviceMap := map[string]func(uuid.UUID, *Z2MDevice, *Expose) XAALDeviceInterface{ "contact": NewContact, "temperature": NewThermometer, "humidity": NewHygrometer, @@ -119,14 +119,17 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) { "battery": NewBattery, "power": NewPowerMeter, "action": NewButtonRemote, + "switch": NewPowerRelay, + "light": NewLamp, } + // Search a matching expose name if createFunc, ok := deviceMap[expose.Name]; ok { - dev = createFunc(addr, zDev) - } else if expose.Type == "switch" { - dev = NewPowerRelay(addr, zDev, &expose) - } else if expose.Type == "light" { - dev = NewLamp(addr, zDev, &expose) + dev = createFunc(addr, zDev, &expose) + } + // Search a matching expose type + if createFunc, ok := deviceMap[zDev.Type]; ok { + dev = createFunc(addr, zDev, &expose) } if dev != nil {