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

Fix the unknown type

Cbor return an interface{} for everything, casting to uint64 or float64
is wrong due to the fact that xAAL schemas support both (even int is
possible). So recast everything to float64 and deal w/ that.

float64 mainly because colorful use float64 for everything, so as
brightness is Z in yxz format...
parent cc4f49d4
No related branches found
No related tags found
No related merge requests found
package main package main
import ( import (
"fmt"
"math" "math"
"strconv" "strconv"
...@@ -73,3 +74,40 @@ func roundToDecimal(value float64, places int) float64 { ...@@ -73,3 +74,40 @@ func roundToDecimal(value float64, places int) float64 {
pow := math.Pow(10, float64(places)) pow := math.Pow(10, float64(places))
return math.Round(value*pow) / pow 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)
}
}
...@@ -307,8 +307,7 @@ func (dev *Lamp) update(payload map[string]interface{}) { ...@@ -307,8 +307,7 @@ func (dev *Lamp) update(payload map[string]interface{}) {
// the color_temp is wrong when you change the mode w/ setMode // the color_temp is wrong when you change the mode w/ setMode
color_temp, exists := payload["color_temp"].(float64) color_temp, exists := payload["color_temp"].(float64)
if exists { if exists {
// Mired = 1,000,000 / Temperature in Kelvin color_temp = convertMired(color_temp)
color_temp = 1000000 / color_temp
dev.GetAttribute("white_temperature").SetValue(int(color_temp)) dev.GetAttribute("white_temperature").SetValue(int(color_temp))
} }
} }
...@@ -317,9 +316,9 @@ func (dev *Lamp) update(payload map[string]interface{}) { ...@@ -317,9 +316,9 @@ func (dev *Lamp) update(payload map[string]interface{}) {
if dev.getMode() == "color" { if dev.getMode() == "color" {
color, exists := payload["color"].(map[string]interface{}) color, exists := payload["color"].(map[string]interface{})
if exists { if exists {
x, _ := color["x"].(float64) x, _ := convertToFloat64(color["x"])
y, _ := color["y"].(float64) y, _ := convertToFloat64(color["y"])
brigthness, _ := payload["brightness"].(float64) brigthness, _ := convertToFloat64(payload["brightness"])
value := xyToColor(x, y, brigthness) value := xyToColor(x, y, brigthness)
slog.Debug("color", "color", value.Hex(), "x", x, "y", y, "tmp", brigthness) slog.Debug("color", "color", value.Hex(), "x", x, "y", y, "tmp", brigthness)
hue, sat, val := value.Hsv() hue, sat, val := value.Hsv()
...@@ -347,19 +346,20 @@ func (dev *Lamp) toggle(xaal.MessageBody) *xaal.MessageBody { ...@@ -347,19 +346,20 @@ func (dev *Lamp) toggle(xaal.MessageBody) *xaal.MessageBody {
} }
func (dev *Lamp) 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"]
value, exists := body["brightness"].(uint64)
if exists { 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 return nil
} }
func (dev *Lamp) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody { func (dev *Lamp) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody {
value, exists := body["white_temperature"].(uint64) value, exists := body["white_temperature"]
if exists { if exists {
value = 1000000 / value target, _ := convertToFloat64(value)
dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, int(value))) target = convertMired(target)
dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, int(target)))
} }
return nil return nil
} }
...@@ -367,9 +367,9 @@ func (dev *Lamp) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody { ...@@ -367,9 +367,9 @@ func (dev *Lamp) setWhiteTemperature(body xaal.MessageBody) *xaal.MessageBody {
func (dev *Lamp) setHSV(body xaal.MessageBody) *xaal.MessageBody { func (dev *Lamp) setHSV(body xaal.MessageBody) *xaal.MessageBody {
value, exist := body["hsv"].([]interface{}) value, exist := body["hsv"].([]interface{})
if exist { if exist {
hue := float64(value[0].(uint64)) hue, _ := convertToFloat64(value[0])
sat := value[1].(float64) sat, _ := convertToFloat64(value[1])
val := value[2].(float64) val, _ := convertToFloat64(value[2])
color := colorful.Hsv(hue, sat, val) color := colorful.Hsv(hue, sat, val)
slog.Debug("setHSV", "color", color.Hex(), "hue", hue, "sat", sat, "val", val) slog.Debug("setHSV", "color", color.Hex(), "hue", hue, "sat", sat, "val", val)
dev.Z2MDevice.Set(fmt.Sprintf(`{"color": { "hex": "%s" }}`, color.Hex())) dev.Z2MDevice.Set(fmt.Sprintf(`{"color": { "hex": "%s" }}`, color.Hex()))
...@@ -383,21 +383,22 @@ func (dev *Lamp) setMode(body xaal.MessageBody) *xaal.MessageBody { ...@@ -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 // 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 // z2m doesn't give an error, but the color_mode doesn't change
// so we set old color or temperature // so we set old color or temperature
//
// dev.Z2MDevice.Set(`{"color_mode": "color_temp"}`)
// dev.Z2MDevice.Set(`{"color_mode": "xy"}`)
switch value { switch value {
case "color": case "color":
// dev.Z2MDevice.Set(`{"color_mode": "xy"}`)
hsv := dev.GetAttribute("hsv").Value.([]float64) hsv := dev.GetAttribute("hsv").Value.([]float64)
color := colorful.Hsv(hsv[0], hsv[1], hsv[2]) color := colorful.Hsv(hsv[0], hsv[1], hsv[2])
dev.Z2MDevice.Set(fmt.Sprintf(`{"color": { "hex": "%s" }}`, color.Hex())) dev.Z2MDevice.Set(fmt.Sprintf(`{"color": { "hex": "%s" }}`, color.Hex()))
case "white": case "white":
// dev.Z2MDevice.Set(`{"color_mode": "color_temp"}`) value := dev.GetAttribute("white_temperature").Value.(float64)
value := dev.GetAttribute("white_temperature").Value.(int)
// if booted in color mode, while_temperature is 0 => divide crash // if booted in color mode, while_temperature is 0 => divide crash
if value == 0 { if value == 0 {
value = 3000 value = 3000
} }
value = 1000000 / value value = convertMired(value)
dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, value)) dev.Z2MDevice.Set(fmt.Sprintf(`{"color_temp": %d}`, int(value)))
} }
} }
return nil return nil
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment