diff --git a/xaal.go b/xaal.go index 17f68a286ffc84e33c4e49516ef6a68711fe9f7f..a3bc43770290bc001b7bf6a72365faecd053b36f 100644 --- a/xaal.go +++ b/xaal.go @@ -53,6 +53,14 @@ type ButtonRemote struct { XAALDevice } +type Motion struct { + XAALDevice +} + +type LuxMeter struct { + XAALDevice +} + type XAALDeviceInterface interface { update(map[string]interface{}) GetXAALDevice() *xaal.Device @@ -445,3 +453,36 @@ func (dev *ButtonRemote) getButtons(xaal.MessageBody) *xaal.MessageBody { } return &body } + +// ============================================================================= +// Motion +// ============================================================================= +func NewMotion(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &Motion{XAALDevice{schemas.NewMotion(addr), zDev, exp}} + dev.setup() + return dev +} + +func (dev *Motion) update(payload map[string]interface{}) { + value, exists := payload[dev.Expose.Name].(bool) + if exists { + dev.GetAttribute("presence").SetValue(value) + } +} + +// ============================================================================= +// LuxMeter +// ============================================================================= +func NewLuxMeter(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface { + dev := &LuxMeter{XAALDevice{schemas.NewLuxmeter(addr), zDev, exp}} + dev.GetAttribute("illuminance").Value = 0 // override + dev.setup() + return dev +} + +func (dev *LuxMeter) update(payload map[string]interface{}) { + lux, err := convertToInt(payload[dev.Expose.Name]) + if err == nil { + dev.GetAttribute("illuminance").SetValue(lux) + } +} diff --git a/z2m.go b/z2m.go index 86926fe0836e6f5cb330a814fa90b3985bc8fdfe..7fcbb3aaca384ba86a332005e75ce2c7af457021 100644 --- a/z2m.go +++ b/z2m.go @@ -111,6 +111,8 @@ func (zDev *Z2MDevice) FindXAALDevices(gw *Gateway) { "action": NewButtonRemote, "switch": NewPowerRelay, "light": NewLamp, + "occupancy": NewMotion, + "illuminance": NewLuxMeter, } // Search a matching expose name