From 5c3605666290fc8dd5d3c651f0357e4e63790f74 Mon Sep 17 00:00:00 2001
From: jkerdreux-imt <jerome.kerdreux@imt-atlantique.fr>
Date: Sat, 16 Nov 2024 12:59:38 +0100
Subject: [PATCH] PowerRelay has the same API as Lamp ;)

API migration
---
 xaal.go | 13 ++++++++-----
 z2m.go  | 12 +-----------
 2 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/xaal.go b/xaal.go
index e572fb5..90561a3 100644
--- a/xaal.go
+++ b/xaal.go
@@ -37,7 +37,7 @@ type Battery struct {
 
 type PowerRelay struct {
 	XAALDevice
-	Property  string
+	Expose    Expose
 	Z2MDevice Z2MDevice
 }
 
@@ -160,8 +160,8 @@ func (dev *Battery) update(payload map[string]interface{}) {
 // =============================================================================
 // PowerRelay
 // =============================================================================
-func NewPowerRelay(addr uuid.UUID, zDev *Z2MDevice, property string) XAALDeviceInterface {
-	dev := &PowerRelay{XAALDevice{schemas.NewPowerrelayToggle(addr)}, property, *zDev}
+func NewPowerRelay(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface {
+	dev := &PowerRelay{XAALDevice{schemas.NewPowerrelayToggle(addr)}, *exp, *zDev}
 	dev.SetMethod("turn_on", dev.On)
 	dev.SetMethod("turn_off", dev.Off)
 	dev.SetMethod("toggle", dev.Toggle)
@@ -170,7 +170,9 @@ func NewPowerRelay(addr uuid.UUID, zDev *Z2MDevice, property string) XAALDeviceI
 }
 
 func (dev *PowerRelay) update(payload map[string]interface{}) {
-	value, exists := payload[dev.Property].(string)
+	// TODO: Handle missing state property, this can be done in constructor
+	state := dev.Expose.GetFeature("state")
+	value, exists := payload[state.Property].(string)
 	if exists {
 		power := dev.GetAttribute("power")
 		switch value {
@@ -183,7 +185,8 @@ func (dev *PowerRelay) update(payload map[string]interface{}) {
 }
 
 func (dev *PowerRelay) SetProperty(value string) {
-	body := fmt.Sprintf(`{"%s": "%s"}`, dev.Property, value)
+	state := dev.Expose.GetFeature("state")
+	body := fmt.Sprintf(`{"%s": "%s"}`, state.Property, value)
 	dev.Z2MDevice.Set(body)
 }
 
diff --git a/z2m.go b/z2m.go
index e642c66..5c65516 100644
--- a/z2m.go
+++ b/z2m.go
@@ -124,18 +124,8 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
 		if createFunc, ok := deviceMap[expose.Name]; ok {
 			dev = createFunc(addr, zDev)
 		} else if expose.Type == "switch" {
-			property := "state"
-			for _, exp := range expose.Features {
-				if strings.Contains(exp.Property, "state") {
-					property = exp.Property
-					break
-				}
-			}
-			dev = NewPowerRelay(addr, zDev, property)
+			dev = NewPowerRelay(addr, zDev, &expose)
 		} else if expose.Type == "light" {
-			// type := NewLamp
-			// for _, exp := range expose.Features {
-			// }
 			dev = NewLamp(addr, zDev, &expose)
 		}
 
-- 
GitLab