diff --git a/utils.go b/utils.go
index 95112e3e94c484c5daae917904cd42878f19cb29..780b786d6b079ea4070f964320e0841f7566d8b3 100644
--- a/utils.go
+++ b/utils.go
@@ -1,6 +1,7 @@
package main
import (
+ "fmt"
"math"
"strconv"
@@ -73,3 +74,40 @@ func roundToDecimal(value float64, places int) float64 {
pow := math.Pow(10, float64(places))
return math.Round(value*pow) / pow
}
+
+// convert Mired to Kelvin and Kelvin to Mired
+// Mired = 1,000,000 / Temperature in Kelvin
+func convertMired(value float64) float64 {
+ return 1e6 / float64(value)
+}
+
+func convertToFloat64(value interface{}) (float64, error) {
+ switch v := value.(type) {
+ case float32:
+ return float64(v), nil
+ case float64:
+ return v, nil
+ case int:
+ return float64(v), nil
+ case uint:
+ return float64(v), nil
+ case int8:
+ return float64(v), nil
+ case uint8:
+ return float64(v), nil
+ case int16:
+ return float64(v), nil
+ case uint16:
+ return float64(v), nil
+ case int32:
+ return float64(v), nil
+ case uint32:
+ return float64(v), nil
+ case int64:
+ return float64(v), nil
+ case uint64:
+ return float64(v), nil
+ default:
+ return 0.0, fmt.Errorf("Unable to converts %v (%T)", value, value)
+ }
+}
diff --git a/xaal.go b/xaal.go
index 0a8498fbc757d79ffff2286a80316f9ea0c7904a..08aff389c658da0263b9f89509d3b7b72c29e8a9 100644
--- a/xaal.go
+++ b/xaal.go
@@ -307,8 +307,7 @@ func (dev *Lamp) update(payload map[string]interface{}) {
// the color_temp is wrong when you change the mode w/ setMode
color_temp, exists := payload["color_temp"].(float64)
if exists {
- // Mired = 1,000,000 / Temperature in Kelvin
- color_temp = 1000000 / color_temp
+ color_temp = convertMired(color_temp)
dev.GetAttribute("white_temperature").SetValue(int(color_temp))
}
}
@@ -317,9 +316,9 @@ func (dev *Lamp) update(payload map[string]interface{}) {
if dev.getMode() == "color" {
color, exists := payload["color"].(map[string]interface{})
if exists {
- x, _ := color["x"].(float64)
- y, _ := color["y"].(float64)
- brigthness, _ := payload["brightness"].(float64)
+ x, _ := convertToFloat64(color["x"])
+ y, _ := convertToFloat64(color["y"])
+ brigthness, _ := convertToFloat64(payload["brightness"])
value := xyToColor(x, y, brigthness)
slog.Debug("color", "color", value.Hex(), "x", x, "y", y, "tmp", brigthness)
hue, sat, val := value.Hsv()
@@ -347,19 +346,20 @@ func (dev *Lamp) toggle(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)
+ value, exists := body["brightness"]
if exists {
- dev.Z2MDevice.Set(fmt.Sprintf(`{"brightness": %d}`, value*255/100))
+ target, _ := convertToFloat64(value)
+ dev.Z2MDevice.Set(fmt.Sprintf(`{"brightness": %d}`, int(target*255/100)))
}
return nil
}
func (dev *Lamp) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody {
- value, exists := body["white_temperature"].(uint64)
+ value, exists := body["white_temperature"]
if exists {
- value = 1000000 / value
- dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, int(value)))
+ target, _ := convertToFloat64(value)
+ target = convertMired(target)
+ dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, int(target)))
}
return nil
}
@@ -367,9 +367,9 @@ func (dev *Lamp) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody {
func (dev *Lamp) setHSV(body xaal.MessageBody) *xaal.MessageBody {
value, exist := body["hsv"].([]interface{})
if exist {
- hue := float64(value[0].(uint64))
- sat := value[1].(float64)
- val := value[2].(float64)
+ hue, _ := convertToFloat64(value[0])
+ sat, _ := convertToFloat64(value[1])
+ val, _ := convertToFloat64(value[2])
color := colorful.Hsv(hue, sat, val)
slog.Debug("setHSV", "color", color.Hex(), "hue", hue, "sat", sat, "val", val)
dev.Z2MDevice.Set(fmt.Sprintf(`{"color": { "hex": "%s" }}`, color.Hex()))
@@ -383,21 +383,22 @@ func (dev *Lamp) setMode(body xaal.MessageBody) *xaal.MessageBody {
// for a unknown reason, we are unable to set the color_mode
// z2m doesn't give an error, but the color_mode doesn't change
// so we set old color or temperature
+ //
+ // dev.Z2MDevice.Set(`{"color_mode": "color_temp"}`)
+ // dev.Z2MDevice.Set(`{"color_mode": "xy"}`)
switch value {
case "color":
- // dev.Z2MDevice.Set(`{"color_mode": "xy"}`)
hsv := dev.GetAttribute("hsv").Value.([]float64)
color := colorful.Hsv(hsv[0], hsv[1], hsv[2])
dev.Z2MDevice.Set(fmt.Sprintf(`{"color": { "hex": "%s" }}`, color.Hex()))
case "white":
- // dev.Z2MDevice.Set(`{"color_mode": "color_temp"}`)
- value := dev.GetAttribute("white_temperature").Value.(int)
+ value := dev.GetAttribute("white_temperature").Value.(float64)
// if booted in color mode, while_temperature is 0 => divide crash
if value == 0 {
value = 3000
}
- value = 1000000 / value
- dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, value))
+ value = convertMired(value)
+ dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, int(value)))
}
}
return nil