package hottisThreeWayThermometer import ( "log" "fmt" "bytes" "strconv" "encoding/base64" "encoding/binary" "encoding/json" "udi/database" ) type hottisThreeWayThermometerValues struct { Status uint8 Battery uint16 SensorAddress1 uint64 Value1 int32 SensorAddress2 uint64 Value2 int32 SensorAddress3 uint64 Value3 int32 } func getSensorName(sensorsMap *map[string]string, sensorAddress uint64) string { key := strconv.FormatUint(sensorAddress, 10) if sensorName, exists := (*sensorsMap)[key]; exists { return sensorName } return "Sensor" + key } func Parse(fPort int, _ []byte, frmPayload string, variables *map[string]database.VariableType, attributes *map[string]interface{}, device *database.Device) error { deviceAttrs := (*device).Attributes sensorsMap := make(map[string]string) sensorsJSON, ok := deviceAttrs["Sensors"].(string) if !ok { return fmt.Errorf("Unable to load sensor map from attributes") } errJ := json.Unmarshal([]byte(sensorsJSON), &sensorsMap) if errJ != nil { return fmt.Errorf("Unable to parse sensor map: %v", errJ) } if fPort != 2 { return fmt.Errorf("Unexpected fPort %d", fPort) } b, err := base64.StdEncoding.DecodeString(frmPayload) if err != nil { return fmt.Errorf("Unable to base64-decode payload: %v", err) } var values hottisThreeWayThermometerValues err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &values) if err != nil { return fmt.Errorf("Unable to cast into struct: %v", err) } var battery float32 = float32(values.Battery) / 1000.0 var value1 float32 = float32(values.Value1) / 128.0 var value2 float32 = float32(values.Value2) / 128.0 var value3 float32 = float32(values.Value3) / 128.0 //log.Printf("Status: %d, Battery: %d", values.Status, values.Battery); log.Printf("Status: %d", values.Status); log.Printf("Battery: %d, %f", values.Battery, battery); log.Printf("Sensor1: Addr: %d, Value: %f", values.SensorAddress1, value1); log.Printf("Sensor2: Addr: %d, Value: %f", values.SensorAddress2, value2); log.Printf("Sensor3: Addr: %d, Value: %f", values.SensorAddress3, value3); (*variables)["Battery"] = database.VariableType { Label: "Battery", Variable: "Voltage", Unit: "V", Value: battery, } (*variables)["Temperature1"] = database.VariableType { Label: getSensorName(&sensorsMap, values.SensorAddress1), Variable: "Temperature", Unit: "°C", Value: value1, } (*variables)["Temperature2"] = database.VariableType { Label: getSensorName(&sensorsMap, values.SensorAddress2), Variable: "Temperature", Unit: "°C", Value: value2, } (*variables)["Temperature3"] = database.VariableType { Label: getSensorName(&sensorsMap, values.SensorAddress3), Variable: "Temperature", Unit: "°C", Value: value3, } (*attributes)["Status"] = values.Status (*attributes)["SensorAddress1"] = values.SensorAddress1 (*attributes)["SensorAddress2"] = values.SensorAddress2 (*attributes)["SensorAddress3"] = values.SensorAddress3 return nil }