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