From c1e81132af5359008105a03a0bb0b46a9eb75f70 Mon Sep 17 00:00:00 2001
From: jkerdreux-imt <jerome.kerdreux@imt-atlantique.fr>
Date: Sun, 17 Nov 2024 01:06:15 +0100
Subject: [PATCH] Use Expose.Name instead of hardcoded property

The Lamp still use hardcoded properties names. It will need some work to
fix this.. which doesn't seems to be used anyways.
---
 xaal.go | 49 ++++++++++++++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 21 deletions(-)

diff --git a/xaal.go b/xaal.go
index d5e770c..62c7aa7 100644
--- a/xaal.go
+++ b/xaal.go
@@ -82,7 +82,7 @@ func NewContact(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterfac
 }
 
 func (dev *Contact) update(payload map[string]interface{}) {
-	value, exists := payload["contact"].(bool)
+	value, exists := payload[dev.Expose.Name].(bool)
 	if exists {
 		dev.GetAttribute("detected").SetValue(!value)
 	}
@@ -98,7 +98,7 @@ func NewThermometer(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInte
 }
 
 func (dev *Thermometer) update(payload map[string]interface{}) {
-	value, exists := payload["temperature"].(float64)
+	value, exists := payload[dev.Expose.Name].(float64)
 	if exists {
 		dev.GetAttribute("temperature").SetValue(value)
 	}
@@ -114,7 +114,7 @@ func NewHygrometer(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInter
 }
 
 func (dev *Hygrometer) update(payload map[string]interface{}) {
-	value, exists := payload["humidity"].(float64)
+	value, exists := payload[dev.Expose.Name].(float64)
 	if exists {
 		dev.GetAttribute("humidity").SetValue(value)
 	}
@@ -132,7 +132,7 @@ func NewLinkQuality(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInte
 }
 
 func (dev *LinkQuality) update(payload map[string]interface{}) {
-	value, exists := payload["linkquality"].(float64)
+	value, exists := payload[dev.Expose.Name].(float64)
 	if exists {
 		value = math.Round(value / 255 * 100)
 		dev.GetAttribute("level").SetValue(value)
@@ -151,7 +151,7 @@ func NewBattery(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterfac
 }
 
 func (dev *Battery) update(payload map[string]interface{}) {
-	value, exists := payload["battery"].(float64)
+	value, exists := payload[dev.Expose.Name].(float64)
 	if exists {
 		dev.GetAttribute("level").SetValue(value)
 	}
@@ -162,9 +162,9 @@ func (dev *Battery) update(payload map[string]interface{}) {
 // =============================================================================
 func NewPowerRelay(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface {
 	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.SetMethod("turn_on", dev.turnOn)
+	dev.SetMethod("turn_off", dev.turnOff)
+	dev.SetMethod("toggle", dev.toggle)
 	dev.setup()
 	return dev
 }
@@ -184,24 +184,24 @@ func (dev *PowerRelay) update(payload map[string]interface{}) {
 	}
 }
 
-func (dev *PowerRelay) SetProperty(value string) {
+func (dev *PowerRelay) SetState(value string) {
 	state := dev.Expose.GetFeature("state")
 	body := fmt.Sprintf(`{"%s": "%s"}`, state.Property, value)
 	dev.Z2MDevice.Set(body)
 }
 
-func (dev *PowerRelay) On(xaal.MessageBody) *xaal.MessageBody {
-	dev.SetProperty("ON")
+func (dev *PowerRelay) turnOn(xaal.MessageBody) *xaal.MessageBody {
+	dev.SetState("ON")
 	return nil
 }
 
-func (dev *PowerRelay) Off(xaal.MessageBody) *xaal.MessageBody {
-	dev.SetProperty("OFF")
+func (dev *PowerRelay) turnOff(xaal.MessageBody) *xaal.MessageBody {
+	dev.SetState("OFF")
 	return nil
 }
 
-func (dev *PowerRelay) Toggle(xaal.MessageBody) *xaal.MessageBody {
-	dev.SetProperty("TOGGLE")
+func (dev *PowerRelay) toggle(xaal.MessageBody) *xaal.MessageBody {
+	dev.SetState("TOGGLE")
 	return nil
 }
 
@@ -218,7 +218,7 @@ func NewPowerMeter(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInter
 
 func (dev *PowerMeter) update(payload map[string]interface{}) {
 	// power
-	value, exists := payload["power"].(float64)
+	value, exists := payload[dev.Expose.Name].(float64)
 	if exists {
 		dev.GetAttribute("power").SetValue(value)
 	}
@@ -232,6 +232,8 @@ func (dev *PowerMeter) update(payload map[string]interface{}) {
 // =============================================================================
 // Lamp
 // =============================================================================
+// The Lamp don't use the Expose.Names right now. Perhaps in future, if we find
+// some lamps w/ different exposes. This will make the code more complex.
 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, exp}}
@@ -332,18 +334,24 @@ func (dev *Lamp) update(payload map[string]interface{}) {
 	}
 }
 
+func (dev *Lamp) setState(value string) {
+	state := dev.Expose.GetFeature("state")
+	body := fmt.Sprintf(`{"%s": "%s"}`, state.Property, value)
+	dev.Z2MDevice.Set(body)
+}
+
 func (dev *Lamp) turnOn(xaal.MessageBody) *xaal.MessageBody {
-	dev.Z2MDevice.Set(`{"state": "ON"}`)
+	dev.setState("ON")
 	return nil
 }
 
 func (dev *Lamp) turnOff(xaal.MessageBody) *xaal.MessageBody {
-	dev.Z2MDevice.Set(`{"state": "OFF"}`)
+	dev.setState("OFF")
 	return nil
 }
 
 func (dev *Lamp) toggle(xaal.MessageBody) *xaal.MessageBody {
-	dev.Z2MDevice.Set(`{"state": "TOGGLE"}`)
+	dev.setState("TOGGLE")
 	return nil
 }
 
@@ -417,7 +425,7 @@ func NewButtonRemote(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInt
 }
 
 func (dev *ButtonRemote) update(payload map[string]interface{}) {
-	value, exists := payload["action"].(string)
+	value, exists := payload[dev.Expose.Name].(string)
 	if exists {
 		body := make(xaal.MessageBody)
 		body["action"] = 0
@@ -427,7 +435,6 @@ func (dev *ButtonRemote) update(payload map[string]interface{}) {
 }
 
 func (dev *ButtonRemote) GetButtons(xaal.MessageBody) *xaal.MessageBody {
-	slog.Info("defaultGetButtons method: get_buttons")
 	body := make(xaal.MessageBody)
 	action := dev.Z2MDevice.GetExpose("action")
 	if action != nil {
-- 
GitLab