Skip to content
Snippets Groups Projects
Commit 2a6d7478 authored by KERDREUX Jerome's avatar KERDREUX Jerome
Browse files

Refactoring Lamp

Finalize the XAAL Device API. I guess this will be the next move, after
doing some color stuff.
parent 1dc40abb
No related branches found
No related tags found
No related merge requests found
......@@ -5,6 +5,7 @@ import (
"log/slog"
"math"
"github.com/davecgh/go-spew/spew"
"gitlab.imt-atlantique.fr/xaal/code/go/core/schemas"
"gitlab.imt-atlantique.fr/xaal/code/go/core/uuid"
"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
......@@ -233,59 +234,36 @@ func (dev *PowerMeter) update(payload map[string]interface{}) {
// =============================================================================
// Lamp
// =============================================================================
func NewLamp(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface {
func NewLamp(addr uuid.UUID, zDev *Z2MDevice, expose *Expose) XAALDeviceInterface {
// This is the default lamp device, we will change it's devType if needed
dev := &Lamp{XAALDevice{schemas.NewLamp(addr)}, *zDev}
dev.SetMethod("turn_on", dev.turnOn)
dev.SetMethod("turn_off", dev.turnOff)
dev.SetMethod("toggle", dev.toggle)
dev.setup(zDev)
return dev
}
func (dev *Lamp) update(payload map[string]interface{}) {
value, exists := payload["state"].(string)
if exists {
light := dev.GetAttribute("light")
switch value {
case "ON":
light.SetValue(true)
case "OFF":
light.SetValue(false)
}
if expose.GetFeature("brightness") != nil {
dev.DevType = "lamp.dimmer"
dev.AddAttribute("brightness", 0)
dev.AddMethod("set_brightness", dev.setBrightness)
}
if expose.GetFeature("color_temp") != nil {
// All bulb w/ color temp ar bright-controlled
dev.AddAttribute("white_temperature", 0)
dev.AddMethod("set_white_temperature", dev.setWhiteTemperature)
}
if expose.GetFeature("color_xy") != nil {
dev.DevType = "lamp.color"
dev.AddAttribute("hsv", nil)
dev.AddAttribute("mode", nil)
dev.UnsupportedAttributes = []string{"scene"}
dev.AddMethod("set_hsv", dev.setHSV)
dev.AddMethod("set_mode", dev.setMode)
}
}
func (dev *Lamp) turnOn(xaal.MessageBody) *xaal.MessageBody {
dev.Z2MDevice.Set(`{"state": "ON"}`)
return nil
}
func (dev *Lamp) turnOff(xaal.MessageBody) *xaal.MessageBody {
dev.Z2MDevice.Set(`{"state": "OFF"}`)
return nil
}
func (dev *Lamp) toggle(xaal.MessageBody) *xaal.MessageBody {
dev.Z2MDevice.Set(`{"state": "TOGGLE"}`)
return nil
}
// =============================================================================
// Lamp Dimmer
// =============================================================================
func NewLampDimmer(addr uuid.UUID, zDev *Z2MDevice) XAALDeviceInterface {
dev := &LampDimmer{XAALDevice{schemas.NewLampColor(addr)}, *zDev}
dev.GetAttribute("mode").SetValue("white")
dev.SetMethod("turn_on", dev.turnOn)
dev.SetMethod("turn_off", dev.turnOff)
dev.SetMethod("toggle", dev.toggle)
dev.SetMethod("set_brightness", dev.setBrightness)
dev.SetMethod("set_white_temperature", dev.setWhiteTemperature)
dev.setup(zDev)
return dev
}
func (dev *LampDimmer) update(payload map[string]interface{}) {
func (dev *Lamp) update(payload map[string]interface{}) {
// state
state, exists := payload["state"].(string)
if exists {
......@@ -300,8 +278,8 @@ func (dev *LampDimmer) update(payload map[string]interface{}) {
// brightness
brightness, exists := payload["brightness"].(float64)
if exists {
brightness = math.Round(brightness / 255 * 100)
dev.GetAttribute("brightness").SetValue(brightness)
brightness = brightness / 255 * 100
dev.GetAttribute("brightness").SetValue(int(brightness))
}
// color_temp
color_temp, exists := payload["color_temp"].(float64)
......@@ -312,22 +290,22 @@ func (dev *LampDimmer) update(payload map[string]interface{}) {
}
}
func (dev *LampDimmer) turnOn(xaal.MessageBody) *xaal.MessageBody {
func (dev *Lamp) turnOn(xaal.MessageBody) *xaal.MessageBody {
dev.Z2MDevice.Set(`{"state": "ON"}`)
return nil
}
func (dev *LampDimmer) turnOff(xaal.MessageBody) *xaal.MessageBody {
func (dev *Lamp) turnOff(xaal.MessageBody) *xaal.MessageBody {
dev.Z2MDevice.Set(`{"state": "OFF"}`)
return nil
}
func (dev *LampDimmer) toggle(xaal.MessageBody) *xaal.MessageBody {
func (dev *Lamp) toggle(xaal.MessageBody) *xaal.MessageBody {
dev.Z2MDevice.Set(`{"state": "TOGGLE"}`)
return nil
}
func (dev *LampDimmer) setBrightness(body xaal.MessageBody) *xaal.MessageBody {
func (dev *Lamp) setBrightness(body xaal.MessageBody) *xaal.MessageBody {
// TODO: I don't know why we receive a uint64 instead of a float64
value, exists := body["brightness"].(uint64)
if exists {
......@@ -336,7 +314,7 @@ func (dev *LampDimmer) setBrightness(body xaal.MessageBody) *xaal.MessageBody {
return nil
}
func (dev *LampDimmer) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody {
func (dev *Lamp) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody {
value, exists := body["white_temperature"].(uint64)
if exists {
value = 1000000 / value
......@@ -345,6 +323,16 @@ func (dev *LampDimmer) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageB
return nil
}
func (dev *Lamp) setHSV(body xaal.MessageBody) *xaal.MessageBody {
spew.Dump(body)
return nil
}
func (dev *Lamp) setMode(body xaal.MessageBody) *xaal.MessageBody {
spew.Dump(body)
return nil
}
// =============================================================================
// NetButtonRemote
// =============================================================================
......
......@@ -136,7 +136,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
// type := NewLamp
// for _, exp := range expose.Features {
// }
dev = NewLampDimmer(addr, zDev)
dev = NewLamp(addr, zDev, &expose)
}
if dev != nil {
......@@ -179,9 +179,6 @@ func (zDev *Z2MDevice) Sync() {
zDev.Publish("dump", "{}")
}
// =============================================================================
// Helpers
// =============================================================================
func (zDev *Z2MDevice) dump() {
tab := table.NewWriter()
tab.SetTitle("Def:" + zDev.FriendlyName)
......@@ -215,6 +212,21 @@ func (zDev *Z2MDevice) dump() {
}
}
// =============================================================================
// Expose
// =============================================================================
func (e *Expose) GetFeature(name string) *Feature {
for _, feature := range e.Features {
if feature.Name == name {
return &feature
}
}
return nil
}
// =============================================================================
// Helpers
// =============================================================================
func (l AccessLevel) String() string {
return [...]string{"--", "R", "W", "RW", "Err", "RN", "Err", "RWN"}[l]
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment