From 053578f6a78c8711dde19f7e679b656a40d92979 Mon Sep 17 00:00:00 2001
From: jkerdreux-imt <jerome.kerdreux@imt-atlantique.fr>
Date: Fri, 22 Nov 2024 01:20:20 +0100
Subject: [PATCH] Add support for current / volt

Unlike other gateway, I didn't hack the power-meter to embbed current
and voltage.. not really sure about this. Chris doesn't like the embbed
stuff.. that's why this time, I will ask him an volt/amp-meter schema.
;)
---
 xaal.go | 44 ++++++++++++++++++++++++++++++++++++++++++++
 z2m.go  |  3 ++-
 2 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/xaal.go b/xaal.go
index 7a5c914..953336b 100644
--- a/xaal.go
+++ b/xaal.go
@@ -61,6 +61,14 @@ type LuxMeter struct {
 	XAALDevice
 }
 
+type VoltMeter struct {
+	XAALDevice
+}
+
+type AmpMeter struct {
+	XAALDevice
+}
+
 type DebugDevice struct {
 	XAALDevice
 }
@@ -492,6 +500,42 @@ func (dev *LuxMeter) update(payload map[string]interface{}) {
 	}
 }
 
+// =============================================================================
+// VoltMeter
+// =============================================================================
+func NewVoltMeter(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface {
+	dev := &VoltMeter{XAALDevice{schemas.NewBasic(addr), zDev, exp}}
+	dev.DevType = "voltmeter.any"
+	dev.AddAttribute("voltage", 0.0)
+	dev.setup()
+	return dev
+}
+
+func (dev *VoltMeter) update(payload map[string]interface{}) {
+	value, err := convertToFloat64(payload[dev.Expose.Name])
+	if err == nil {
+		dev.GetAttribute("voltage").SetValue(value)
+	}
+}
+
+// =============================================================================
+// AmpMeter
+// =============================================================================
+func NewAmpMeter(addr uuid.UUID, zDev *Z2MDevice, exp *Expose) XAALDeviceInterface {
+	dev := &AmpMeter{XAALDevice{schemas.NewBasic(addr), zDev, exp}}
+	dev.DevType = "ampmeter.any"
+	dev.AddAttribute("current", 0.0)
+	dev.setup()
+	return dev
+}
+
+func (dev *AmpMeter) update(payload map[string]interface{}) {
+	value, err := convertToFloat64(payload[dev.Expose.Name])
+	if err == nil {
+		dev.GetAttribute("current").SetValue(value)
+	}
+}
+
 // =============================================================================
 // Debug Device
 // =============================================================================
diff --git a/z2m.go b/z2m.go
index 68d058c..27486bc 100644
--- a/z2m.go
+++ b/z2m.go
@@ -113,7 +113,8 @@ func (zDev *Z2MDevice) FindXAALDevices(gw *Gateway) {
 			"light":       NewLamp,
 			"occupancy":   NewMotion,
 			"illuminance": NewLuxMeter,
-			"voltage":     NewDebugDevice,
+			"voltage":     NewVoltMeter,
+			"current":     NewAmpMeter,
 		}
 
 		// Search a matching expose name
-- 
GitLab