70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package hottisScd30
|
|
|
|
import (
|
|
//"log"
|
|
"fmt"
|
|
"bytes"
|
|
"encoding/base64"
|
|
"encoding/binary"
|
|
"udi/database"
|
|
)
|
|
|
|
type hottisScd30Values struct {
|
|
Status uint8
|
|
CO2Conc int32
|
|
Temp int32
|
|
Hum int32
|
|
Bri int32
|
|
}
|
|
|
|
|
|
func Parse(fPort int, _ []byte, frmPayload string, variables *map[string]database.VariableType, attributes *map[string]interface{}, _ *database.Device) error {
|
|
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 hottisScd30Values
|
|
err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &values)
|
|
if err != nil {
|
|
return fmt.Errorf("Unable to cast into struct: %v", err)
|
|
}
|
|
var co2concentration float32 = float32(values.CO2Conc) / 100;
|
|
var temperature float32 = float32(values.Temp) / 100;
|
|
var humidity float32 = float32(values.Hum) / 100;
|
|
|
|
// log.Printf("CO2: %f, Temp: %f, Hum: %f, Status: %d", co2concentration, temperature, humidity, values.Status)
|
|
|
|
(*variables)["CO2concentration"] = database.VariableType {
|
|
Label: "CO2concentration",
|
|
Variable: "Concentration",
|
|
Unit: "ppm",
|
|
Value: co2concentration,
|
|
}
|
|
(*variables)["Temperature"] = database.VariableType {
|
|
Label: "Temperature",
|
|
Variable: "Temperature",
|
|
Unit: "°C",
|
|
Value: temperature,
|
|
}
|
|
(*variables)["Humidity"] = database.VariableType {
|
|
Label: "Humidity",
|
|
Variable: "Humidity",
|
|
Unit: "%",
|
|
Value: humidity,
|
|
}
|
|
(*variables)["Brightness"] = database.VariableType {
|
|
Label: "Brightness",
|
|
Variable: "Brightness",
|
|
Unit: "",
|
|
Value: values.Bri,
|
|
}
|
|
|
|
(*attributes)["Status"] = values.Status
|
|
return nil
|
|
}
|